From b43f13092dc3f28fbf67c27c801ed2935effa8e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Sandstr=C3=B6m?= Date: Fri, 21 Mar 2025 21:42:47 +0100 Subject: [PATCH 1/6] Edid Resolution parsing, working draft By adding a user_edid.bin in VDD's install path and set to true in vdd_settings.xml. It will replace all resolutions from vdd_settings.xml with what it manage to grab from the edid file. Needs more testing --- .../MttVDD/Driver.cpp | 240 +++++++--------- .../MttVDD/MttVDD.vcxproj | 2 + .../MttVDD/edid_parser.cpp | 260 ++++++++++++++++++ Virtual Display Driver (HDR)/vdd_settings.xml | 2 + 4 files changed, 360 insertions(+), 144 deletions(-) create mode 100644 Virtual Display Driver (HDR)/MttVDD/edid_parser.cpp diff --git a/Virtual Display Driver (HDR)/MttVDD/Driver.cpp b/Virtual Display Driver (HDR)/MttVDD/Driver.cpp index 3012b563..752cff89 100644 --- a/Virtual Display Driver (HDR)/MttVDD/Driver.cpp +++ b/Virtual Display Driver (HDR)/MttVDD/Driver.cpp @@ -13,6 +13,7 @@ Copyright (c) Microsoft Corporation --*/ #include "Driver.h" +#include "edid_parser.cpp" //#include "Driver.tmh" #include #include @@ -1492,13 +1493,15 @@ vector split(string& input, char delimiter) void loadSettings() { const wstring settingsname = confpath + L"\\vdd_settings.xml"; const wstring& filename = settingsname; + bool parseEdidRes = false; // Default to false unless specified in XML + if (PathFileExistsW(filename.c_str())) { CComPtr pStream; CComPtr pReader; HRESULT hr = SHCreateStreamOnFileW(filename.c_str(), STGM_READ, &pStream); if (FAILED(hr)) { vddlog("e", "Loading Settings: Failed to create file stream."); - return; + return; } hr = CreateXmlReader(__uuidof(IXmlReader), (void**)&pReader, NULL); if (FAILED(hr)) { @@ -1528,16 +1531,12 @@ void loadSettings() { switch (nodeType) { case XmlNodeType_Element: hr = pReader->GetLocalName(&pwszLocalName, &cwchLocalName); - if (FAILED(hr)) { - return; - } + if (FAILED(hr)) return; currentElement = wstring(pwszLocalName, cwchLocalName); break; case XmlNodeType_Text: hr = pReader->GetValue(&pwszValue, &cwchValue); - if (FAILED(hr)) { - return; - } + if (FAILED(hr)) return; if (currentElement == L"count") { monitorcount = stoi(wstring(pwszValue, cwchValue)); if (monitorcount == 0) { @@ -1550,25 +1549,18 @@ void loadSettings() { } else if (currentElement == L"width") { width = wstring(pwszValue, cwchValue); - if (width.empty()) { - width = L"800"; - } + if (width.empty()) width = L"800"; } else if (currentElement == L"height") { height = wstring(pwszValue, cwchValue); - if (height.empty()) { - height = L"600"; - } + if (height.empty()) height = L"600"; resolutions.insert(make_tuple(stoi(width), stoi(height))); } else if (currentElement == L"refresh_rate") { refreshRate = wstring(pwszValue, cwchValue); - if (refreshRate.empty()) { - refreshRate = L"30"; - } + if (refreshRate.empty()) refreshRate = L"30"; int vsync_num, vsync_den; float_to_vsync(stof(refreshRate), vsync_num, vsync_den); - res.push_back(make_tuple(stoi(width), stoi(height), vsync_num, vsync_den)); stringstream ss; ss << "Added: " << stoi(width) << "x" << stoi(height) << " @ " << vsync_num << "/" << vsync_den << "Hz"; @@ -1577,155 +1569,115 @@ void loadSettings() { else if (currentElement == L"g_refresh_rate") { globalRefreshRates.push_back(stoi(wstring(pwszValue, cwchValue))); } + else if (currentElement == L"parse_edid_res") { + wstring value(pwszValue, cwchValue); + parseEdidRes = (value == L"true" || value == L"1"); // Accept "true" or "1" + } break; } } - /* - * This is for res testing, stores each resolution then iterates through each global adding a res for each one - * - - for (const auto& resTuple : resolutions) { - stringstream ss; - ss << get<0>(resTuple) << "x" << get<1>(resTuple); - vddlog("t", ss.str().c_str()); - } - - for (const auto& globalRate : globalRefreshRates) { - stringstream ss; - ss << globalRate << " Hz"; - vddlog("t", ss.str().c_str()); - } - */ - for (int globalRate : globalRefreshRates) { for (const auto& resTuple : resolutions) { int global_width = get<0>(resTuple); int global_height = get<1>(resTuple); - int vsync_num, vsync_den; float_to_vsync(static_cast(globalRate), vsync_num, vsync_den); res.push_back(make_tuple(global_width, global_height, vsync_num, vsync_den)); } } - /* - * logging all resolutions after added global - * - for (const auto& tup : res) { - stringstream ss; - ss << "(" - << get<0>(tup) << ", " - << get<1>(tup) << ", " - << get<2>(tup) << ", " - << get<3>(tup) << ")"; - vddlog("t", ss.str().c_str()); - } - - */ - - numVirtualDisplays = monitorcount; gpuname = gpuFriendlyName; monitorModes = res; - vddlog("i","Using vdd_settings.xml"); - return; + vddlog("i", "Using vdd_settings.xml"); } - const wstring optionsname = confpath + L"\\option.txt"; - ifstream ifs(optionsname); - if (ifs.is_open()) { - string line; - if (getline(ifs, line) && !line.empty()) { - numVirtualDisplays = stoi(line); - vector> res; - - while (getline(ifs, line)) { - vector strvec = split(line, ','); - if (strvec.size() == 3 && strvec[0].substr(0, 1) != "#") { - int vsync_num, vsync_den; - float_to_vsync(stof(strvec[2]), vsync_num, vsync_den); - res.push_back({ stoi(strvec[0]), stoi(strvec[1]), vsync_num, vsync_den }); - } - } - - vddlog("i", "Using option.txt"); - monitorModes = res; - for (const auto& mode : res) { - int width, height, vsync_num, vsync_den; - tie(width, height, vsync_num, vsync_den) = mode; - stringstream ss; - ss << "Resolution: " << width << "x" << height << " @ " << vsync_num << "/" << vsync_den << "Hz"; - vddlog("d", ss.str().c_str()); - } - return; - } else { - vddlog("w", "option.txt is empty or the first line is invalid. Enabling Fallback"); - } -} - - - numVirtualDisplays = 1; - vector> res; - vector> fallbackRes = { - {800, 600, 30.0f}, - {800, 600, 60.0f}, - {800, 600, 90.0f}, - {800, 600, 120.0f}, - {800, 600, 144.0f}, - {800, 600, 165.0f}, - {1280, 720, 30.0f}, - {1280, 720, 60.0f}, - {1280, 720, 90.0f}, - {1280, 720, 130.0f}, - {1280, 720, 144.0f}, - {1280, 720, 165.0f}, - {1366, 768, 30.0f}, - {1366, 768, 60.0f}, - {1366, 768, 90.0f}, - {1366, 768, 120.0f}, - {1366, 768, 144.0f}, - {1366, 768, 165.0f}, - {1920, 1080, 30.0f}, - {1920, 1080, 60.0f}, - {1920, 1080, 90.0f}, - {1920, 1080, 120.0f}, - {1920, 1080, 144.0f}, - {1920, 1080, 165.0f}, - {2560, 1440, 30.0f}, - {2560, 1440, 60.0f}, - {2560, 1440, 90.0f}, - {2560, 1440, 120.0f}, - {2560, 1440, 144.0f}, - {2560, 1440, 165.0f}, - {3840, 2160, 30.0f}, - {3840, 2160, 60.0f}, - {3840, 2160, 90.0f}, - {3840, 2160, 120.0f}, - {3840, 2160, 144.0f}, - {3840, 2160, 165.0f} - }; - - vddlog("i", "Loading Fallback - no settings found"); - - for (const auto& mode : fallbackRes) { - int width, height; - float refreshRate; - tie(width, height, refreshRate) = mode; - - int vsync_num, vsync_den; - float_to_vsync(refreshRate, vsync_num, vsync_den); - - stringstream ss; - res.push_back(make_tuple(width, height, vsync_num, vsync_den)); + else { + const wstring optionsname = confpath + L"\\option.txt"; + ifstream ifs(optionsname); + if (ifs.is_open()) { + string line; + if (getline(ifs, line) && !line.empty()) { + numVirtualDisplays = stoi(line); + vector> res; + + while (getline(ifs, line)) { + vector strvec = split(line, ','); + if (strvec.size() == 3 && strvec[0].substr(0, 1) != "#") { + int vsync_num, vsync_den; + float_to_vsync(stof(strvec[2]), vsync_num, vsync_den); + res.push_back({ stoi(strvec[0]), stoi(strvec[1]), vsync_num, vsync_den }); + } + } + vddlog("i", "Using option.txt"); + monitorModes = res; + for (const auto& mode : res) { + int width, height, vsync_num, vsync_den; + tie(width, height, vsync_num, vsync_den) = mode; + stringstream ss; + ss << "Resolution: " << width << "x" << height << " @ " << vsync_num << "/" << vsync_den << "Hz"; + vddlog("d", ss.str().c_str()); + } + } + else { + vddlog("w", "option.txt is empty or the first line is invalid. Enabling Fallback"); + } + ifs.close(); + } + else { + numVirtualDisplays = 1; + vector> res; + vector> fallbackRes = { + {800, 600, 30.0f}, {800, 600, 60.0f}, {800, 600, 90.0f}, {800, 600, 120.0f}, {800, 600, 144.0f}, {800, 600, 165.0f}, + {1280, 720, 30.0f}, {1280, 720, 60.0f}, {1280, 720, 90.0f}, {1280, 720, 130.0f}, {1280, 720, 144.0f}, {1280, 720, 165.0f}, + {1366, 768, 30.0f}, {1366, 768, 60.0f}, {1366, 768, 90.0f}, {1366, 768, 120.0f}, {1366, 768, 144.0f}, {1366, 768, 165.0f}, + {1920, 1080, 30.0f}, {1920, 1080, 60.0f}, {1920, 1080, 90.0f}, {1920, 1080, 120.0f}, {1920, 1080, 144.0f}, {1920, 1080, 165.0f}, + {2560, 1440, 30.0f}, {2560, 1440, 60.0f}, {2560, 1440, 90.0f}, {2560, 1440, 120.0f}, {2560, 1440, 144.0f}, {2560, 1440, 165.0f}, + {3840, 2160, 30.0f}, {3840, 2160, 60.0f}, {3840, 2160, 90.0f}, {3840, 2160, 120.0f}, {3840, 2160, 144.0f}, {3840, 2160, 165.0f} + }; - ss << "Resolution: " << width << "x" << height << " @ " << vsync_num << "/" << vsync_den << "Hz"; - vddlog("d", ss.str().c_str()); + vddlog("i", "Loading Fallback - no settings found"); + for (const auto& mode : fallbackRes) { + int width, height; + float refreshRate; + tie(width, height, refreshRate) = mode; + int vsync_num, vsync_den; + float_to_vsync(refreshRate, vsync_num, vsync_den); + res.push_back(make_tuple(width, height, vsync_num, vsync_den)); + stringstream ss; + ss << "Resolution: " << width << "x" << height << " @ " << vsync_num << "/" << vsync_den << "Hz"; + vddlog("d", ss.str().c_str()); + } + monitorModes = res; + } } - monitorModes = res; - return; - + // EDID override: Only if true in XML and user_edid.bin exists + if (parseEdidRes) { + const wstring edidname = confpath + L"\\user_edid.bin"; + if (PathFileExistsW(edidname.c_str())) { + try { + string edidPath(edidname.begin(), edidname.end()); // Convert wstring to string + monitorModes = EdidParser::load_and_parse_edid(edidPath); + vddlog("i", "Overriding monitor modes with user_edid.bin (parse_edid_res = true)"); + for (const auto& mode : monitorModes) { + int width, height, vsync_num, vsync_den; + tie(width, height, vsync_num, vsync_den) = mode; + stringstream ss; + ss << "EDID Resolution: " << width << "x" << height << " @ " << vsync_num << "/" << vsync_den << "Hz"; + vddlog("d", ss.str().c_str()); + } + } + catch (const std::exception& e) { + vddlog("e", ("EDID parsing failed: " + string(e.what())).c_str()); + // Keep existing monitorModes (XML, option.txt, or fallback) on failure + } + } + else { + vddlog("w", "parse_edid_res is true, but user_edid.bin not found; keeping current modes"); + } + } } _Use_decl_annotations_ diff --git a/Virtual Display Driver (HDR)/MttVDD/MttVDD.vcxproj b/Virtual Display Driver (HDR)/MttVDD/MttVDD.vcxproj index ea858780..dc979e31 100644 --- a/Virtual Display Driver (HDR)/MttVDD/MttVDD.vcxproj +++ b/Virtual Display Driver (HDR)/MttVDD/MttVDD.vcxproj @@ -271,6 +271,8 @@ true /D_ATL_NO_WIN_SUPPORT /DUMDF_DRIVER /DIDDCX_VERSION_MAJOR=1 /DIDDCX_VERSION_MINOR=10 /DIDDCX_MINIMUM_VERSION_REQUIRED=3 %(AdditionalOptions) $(ProjectDir)..\..\Common\Include;%(AdditionalIncludeDirectories) + false + stdcpp14 %(AdditionalDependencies);OneCoreUAP.lib;avrt.lib diff --git a/Virtual Display Driver (HDR)/MttVDD/edid_parser.cpp b/Virtual Display Driver (HDR)/MttVDD/edid_parser.cpp new file mode 100644 index 00000000..21927e20 --- /dev/null +++ b/Virtual Display Driver (HDR)/MttVDD/edid_parser.cpp @@ -0,0 +1,260 @@ +#include +#include +#include +#include +#include +#include + +namespace EdidParser { + +using MonitorMode = std::tuple; // (x_res, y_res, refresh_rate, divider) + +static void add_vic_resolution(uint8_t vic, std::vector& modes) { + // Complete VIC table from CEA-861 (up to latest, e.g., CEA-861-J) + // Refresh rate as integer (Hz), divider adjusts to precise rate (e.g., 1001 for 59.94 Hz) + switch (vic) { + case 1: modes.push_back({640, 480, 60, 1}); break; // 640x480@60p + case 2: modes.push_back({720, 480, 60, 1001}); break; // 720x480@59.94p + case 3: modes.push_back({720, 480, 60, 1}); break; // 720x480@60p + case 4: modes.push_back({1280, 720, 60, 1}); break; // 1280x720@60p + case 5: modes.push_back({1920, 1080, 60, 1001}); break; // 1920x1080@59.94i + case 6: modes.push_back({720, 480, 60, 1001}); break; // 720x480@59.94i (1440x480i) + case 7: modes.push_back({720, 480, 60, 1}); break; // 720x480@60i (1440x480i) + case 8: modes.push_back({720, 240, 60, 1001}); break; // 720x240@59.94p + case 9: modes.push_back({720, 240, 60, 1}); break; // 720x240@60p + case 10: modes.push_back({1440, 480, 60, 1001}); break; // 1440x480@59.94i + case 11: modes.push_back({1440, 480, 60, 1}); break; // 1440x480@60i + case 12: modes.push_back({1440, 240, 60, 1001}); break; // 1440x240@59.94p + case 13: modes.push_back({1440, 240, 60, 1}); break; // 1440x240@60p + case 14: modes.push_back({1440, 480, 60, 1001}); break; // 1440x480@59.94p + case 15: modes.push_back({1440, 480, 60, 1}); break; // 1440x480@60p + case 16: modes.push_back({1920, 1080, 60, 1}); break; // 1920x1080@60p + case 17: modes.push_back({720, 576, 50, 1}); break; // 720x576@50p + case 18: modes.push_back({720, 576, 50, 1}); break; // 720x576@50i (1440x576i) + case 19: modes.push_back({1280, 720, 50, 1}); break; // 1280x720@50p + case 20: modes.push_back({1920, 1080, 50, 1}); break; // 1920x1080@50i + case 21: modes.push_back({720, 576, 50, 1}); break; // 720x576@50i (1440x576i) + case 22: modes.push_back({720, 576, 50, 1}); break; // 720x576@50p + case 23: modes.push_back({720, 288, 50, 1}); break; // 720x288@50p + case 24: modes.push_back({720, 288, 50, 1}); break; // 720x288@50p + case 25: modes.push_back({1440, 576, 50, 1}); break; // 1440x576@50i + case 26: modes.push_back({1440, 288, 50, 1}); break; // 1440x288@50p + case 27: modes.push_back({1440, 288, 50, 1}); break; // 1440x288@50p + case 28: modes.push_back({1440, 576, 50, 1}); break; // 1440x576@50p + case 29: modes.push_back({1440, 576, 50, 1}); break; // 1440x576@50p + case 30: modes.push_back({1920, 1080, 50, 1}); break; // 1920x1080@50p + case 31: modes.push_back({1920, 1080, 100, 1}); break; // 1920x1080@100p + case 32: modes.push_back({1920, 1080, 24, 1}); break; // 1920x1080@24p + case 33: modes.push_back({1920, 1080, 25, 1}); break; // 1920x1080@25p + case 34: modes.push_back({1920, 1080, 30, 1}); break; // 1920x1080@30p + case 35: modes.push_back({720, 480, 120, 1}); break; // 720x480@120p + case 36: modes.push_back({720, 480, 120, 1}); break; // 720x480@120i + case 37: modes.push_back({720, 240, 120, 1}); break; // 720x240@120p + case 38: modes.push_back({1440, 480, 120, 1}); break; // 1440x480@120i + case 39: modes.push_back({1440, 480, 120, 1}); break; // 1440x480@120p + case 40: modes.push_back({720, 576, 100, 1}); break; // 720x576@100p + case 41: modes.push_back({720, 576, 100, 1}); break; // 720x576@100i + case 42: modes.push_back({720, 288, 100, 1}); break; // 720x288@100p + case 43: modes.push_back({1440, 576, 100, 1}); break; // 1440x576@100i + case 44: modes.push_back({1440, 576, 100, 1}); break; // 1440x576@100p + case 45: modes.push_back({720, 480, 200, 1}); break; // 720x480@200p + case 46: modes.push_back({720, 480, 200, 1}); break; // 720x480@200i + case 47: modes.push_back({720, 240, 200, 1}); break; // 720x240@200p + case 48: modes.push_back({1440, 480, 200, 1}); break; // 1440x480@200i + case 49: modes.push_back({1440, 480, 200, 1}); break; // 1440x480@200p + case 50: modes.push_back({720, 576, 200, 1}); break; // 720x576@200p + case 51: modes.push_back({720, 576, 200, 1}); break; // 720x576@200i + case 52: modes.push_back({720, 288, 200, 1}); break; // 720x288@200p + case 53: modes.push_back({1440, 576, 200, 1}); break; // 1440x576@200i + case 54: modes.push_back({1440, 576, 200, 1}); break; // 1440x576@200p + case 55: modes.push_back({720, 480, 240, 1}); break; // 720x480@240p + case 56: modes.push_back({720, 480, 240, 1}); break; // 720x480@240i + case 57: modes.push_back({720, 240, 240, 1}); break; // 720x240@240p + case 58: modes.push_back({1440, 480, 240, 1}); break; // 1440x480@240i + case 59: modes.push_back({1440, 480, 240, 1}); break; // 1440x480@240p + case 60: modes.push_back({1280, 720, 24, 1}); break; // 1280x720@24p + case 61: modes.push_back({1280, 720, 25, 1}); break; // 1280x720@25p + case 62: modes.push_back({1280, 720, 30, 1}); break; // 1280x720@30p + case 63: modes.push_back({1920, 1080, 120, 1}); break; // 1920x1080@120p + case 64: modes.push_back({1920, 1080, 120, 1}); break; // 1920x1080@120i + case 65: modes.push_back({1280, 720, 120, 1}); break; // 1280x720@120p + case 66: modes.push_back({720, 480, 60, 1001}); break; // 720x480@59.94p (alt) + case 67: modes.push_back({720, 480, 60, 1}); break; // 720x480@60p (alt) + case 68: modes.push_back({720, 576, 50, 1}); break; // 720x576@50p (alt) + case 69: modes.push_back({1280, 720, 60, 1001}); break; // 1280x720@59.94p + case 70: modes.push_back({1280, 720, 24, 1001}); break; // 1280x720@23.976p + case 71: modes.push_back({1920, 1080, 60, 1001}); break;// 1920x1080@59.94p + case 72: modes.push_back({1920, 1080, 24, 1001}); break;// 1920x1080@23.976p + case 73: modes.push_back({1920, 1080, 30, 1001}); break;// 1920x1080@29.97p + case 74: modes.push_back({2880, 480, 60, 1001}); break; // 2880x480@59.94i + case 75: modes.push_back({2880, 480, 60, 1}); break; // 2880x480@60i + case 76: modes.push_back({2880, 576, 50, 1}); break; // 2880x576@50i + case 77: modes.push_back({2880, 576, 50, 1}); break; // 2880x576@50p + case 78: modes.push_back({1920, 1080, 30, 1001}); break;// 1920x1080@29.97i + case 79: modes.push_back({1920, 1080, 60, 1}); break; // 1920x1080@60i + case 80: modes.push_back({1280, 720, 30, 1001}); break; // 1280x720@29.97p + case 81: modes.push_back({720, 480, 60, 1001}); break; // 720x480@59.94p (alt 2) + case 82: modes.push_back({720, 480, 60, 1}); break; // 720x480@60p (alt 2) + case 83: modes.push_back({720, 576, 50, 1}); break; // 720x576@50p (alt 2) + case 84: modes.push_back({720, 480, 120, 1}); break; // 720x480@120p (alt) + case 85: modes.push_back({720, 576, 100, 1}); break; // 720x576@100p (alt) + case 86: modes.push_back({720, 480, 240, 1}); break; // 720x480@240p (alt) + case 87: modes.push_back({720, 576, 200, 1}); break; // 720x576@200p (alt) + case 88: modes.push_back({720, 480, 60, 1001}); break; // 720x480@59.94i (alt) + case 89: modes.push_back({720, 480, 60, 1}); break; // 720x480@60i (alt) + case 90: modes.push_back({720, 576, 50, 1}); break; // 720x576@50i (alt) + case 91: modes.push_back({1920, 1080, 24, 1001}); break;// 1920x1080@23.976p (alt) + case 92: modes.push_back({1920, 1080, 30, 1}); break; // 1920x1080@30p (alt) + case 93: modes.push_back({3840, 2160, 24, 1}); break; // 3840x2160@24p + case 94: modes.push_back({3840, 2160, 25, 1}); break; // 3840x2160@25p + case 95: modes.push_back({3840, 2160, 30, 1}); break; // 3840x2160@30p + case 96: modes.push_back({3840, 2160, 50, 1}); break; // 3840x2160@50p + case 97: modes.push_back({3840, 2160, 60, 1}); break; // 3840x2160@60p + case 98: modes.push_back({4096, 2160, 24, 1}); break; // 4096x2160@24p + case 99: modes.push_back({4096, 2160, 25, 1}); break; // 4096x2160@25p + case 100: modes.push_back({4096, 2160, 30, 1}); break; // 4096x2160@30p + case 101: modes.push_back({4096, 2160, 50, 1}); break; // 4096x2160@50p + case 102: modes.push_back({4096, 2160, 60, 1}); break; // 4096x2160@60p + case 103: modes.push_back({3840, 2160, 24, 1001}); break;// 3840x2160@23.976p + case 104: modes.push_back({3840, 2160, 30, 1001}); break;// 3840x2160@29.97p + case 105: modes.push_back({3840, 2160, 60, 1001}); break;// 3840x2160@59.94p + case 106: modes.push_back({4096, 2160, 24, 1001}); break;// 4096x2160@23.976p + case 107: modes.push_back({4096, 2160, 30, 1001}); break;// 4096x2160@29.97p + case 108: modes.push_back({4096, 2160, 60, 1001}); break;// 4096x2160@59.94p + case 109: modes.push_back({3840, 2160, 120, 1}); break; // 3840x2160@120p + case 110: modes.push_back({3840, 2160, 100, 1}); break; // 3840x2160@100p + case 111: modes.push_back({4096, 2160, 120, 1}); break; // 4096x2160@120p + case 112: modes.push_back({4096, 2160, 100, 1}); break; // 4096x2160@100p + case 113: modes.push_back({7680, 4320, 24, 1}); break; // 7680x4320@24p + case 114: modes.push_back({7680, 4320, 25, 1}); break; // 7680x4320@25p + case 115: modes.push_back({7680, 4320, 30, 1}); break; // 7680x4320@30p + case 116: modes.push_back({7680, 4320, 50, 1}); break; // 7680x4320@50p + case 117: modes.push_back({7680, 4320, 60, 1}); break; // 7680x4320@60p + case 118: modes.push_back({7680, 4320, 24, 1001}); break;// 7680x4320@23.976p + case 119: modes.push_back({7680, 4320, 30, 1001}); break;// 7680x4320@29.97p + case 120: modes.push_back({7680, 4320, 60, 1001}); break;// 7680x4320@59.94p + case 121: modes.push_back({7680, 4320, 120, 1}); break; // 7680x4320@120p + case 122: modes.push_back({7680, 4320, 100, 1}); break; // 7680x4320@100p + default: break; // Unknown VIC, skip + } +} + +static void parse_cea861_block(const uint8_t* block, std::vector& modes) { + uint8_t dtd_start = block[2]; + if (dtd_start == 0) return; + + int offset = 4; + while (offset < dtd_start) { + uint8_t len_type = block[offset++]; + uint8_t len = len_type & 0x1F; + uint8_t type = len_type >> 5; + if (type == 2) { // Video Data Block + for (int i = 0; i < len; ++i) { + uint8_t vic = block[offset + i]; + add_vic_resolution(vic, modes); + } + } + offset += len; + } + + offset = dtd_start; + while (offset < 128 && block[offset] != 0x00) { + int x_res = ((block[offset + 4] & 0xF0) << 4) | block[offset + 2]; + int y_res = ((block[offset + 7] & 0xF0) << 4) | block[offset + 5]; + uint32_t pixel_clock = (block[offset + 1] << 8) | block[offset]; // in 10 kHz + int refresh_rate = static_cast((pixel_clock * 10000.0f) / (x_res * y_res) + 0.5f); + int divider = (refresh_rate == 60 || refresh_rate == 30 || refresh_rate == 24) ? 1001 : 1; + modes.push_back({x_res, y_res, refresh_rate, divider}); + offset += 18; + } +} + +static void parse_displayid_block(const uint8_t* block, std::vector& modes) { + int offset = 3; + while (offset < 128) { + uint8_t type = block[offset++]; + if (type == 0x00) break; + uint8_t len = block[offset++]; + if (type == 0x02) { // Type 1 Timing + int x_res = ((block[offset + 1] & 0x0F) << 8) | block[offset]; + int y_res = ((block[offset + 3] & 0x0F) << 8) | block[offset + 2]; + int refresh_rate = block[offset + 4]; + int divider = (refresh_rate == 60 || refresh_rate == 30 || refresh_rate == 24) ? 1001 : 1; + modes.push_back({x_res, y_res, refresh_rate, divider}); + } + offset += len; + } +} + +static void parse_base_block(const uint8_t* edid_data, std::vector& modes) { + for (int i = 38; i < 54; i += 2) { + uint8_t byte1 = edid_data[i]; + uint8_t byte2 = edid_data[i + 1]; + if (byte1 == 0x01 && byte2 == 0x01) continue; + + int x_res = (byte1 + 31) * 8; + int aspect = (byte2 >> 6) & 0x03; + int y_res; + switch (aspect) { + case 0: y_res = x_res * 3 / 4; break; + case 1: y_res = x_res * 9 / 16; break; + case 2: y_res = x_res * 10 / 16; break; + case 3: y_res = x_res; break; + } + int refresh_rate = (byte2 & 0x3F) + 60; + int divider = (refresh_rate == 60) ? 1001 : 1; + modes.push_back({x_res, y_res, refresh_rate, divider}); + } + + for (int i = 54; i < 126; i += 18) { + if (edid_data[i] == 0x00 && edid_data[i + 1] == 0x00) continue; + + int x_res = ((edid_data[i + 4] & 0xF0) << 4) | edid_data[i + 2]; + int y_res = ((edid_data[i + 7] & 0xF0) << 4) | edid_data[i + 5]; + uint32_t pixel_clock = (edid_data[i + 1] << 8) | edid_data[i]; // in 10 kHz + int refresh_rate = static_cast((pixel_clock * 10000.0f) / (x_res * y_res) + 0.5f); + int divider = (refresh_rate == 60 || refresh_rate == 30 || refresh_rate == 24) ? 1001 : 1; + modes.push_back({x_res, y_res, refresh_rate, divider}); + } +} + +std::vector parse_edid(const uint8_t* edid_data, size_t size) { + std::vector modes; + + if (size < 128 || edid_data[0] != 0x00 || edid_data[1] != 0xFF || edid_data[2] != 0xFF || + edid_data[3] != 0xFF || edid_data[4] != 0xFF || edid_data[5] != 0xFF || edid_data[6] != 0xFF || + edid_data[7] != 0x00) { + throw std::runtime_error("Invalid EDID header"); + } + + parse_base_block(edid_data, modes); + + uint8_t ext_count = edid_data[126]; + if (size < 128 * (ext_count + 1)) { + throw std::runtime_error("EDID data too short for extension blocks"); + } + + for (uint8_t i = 0; i < ext_count; ++i) { + const uint8_t* ext_block = edid_data + 128 * (i + 1); + switch (ext_block[0]) { + case 0x02: parse_cea861_block(ext_block, modes); break; + case 0x10: parse_displayid_block(ext_block, modes); break; + default: break; + } + } + + return modes; +} + +std::vector load_and_parse_edid(const std::string& filename) { + std::ifstream file(filename, std::ios::binary); + if (!file) throw std::runtime_error("Failed to open EDID file"); + file.seekg(0, std::ios::end); + size_t size = file.tellg(); + file.seekg(0, std::ios::beg); + std::vector edid_data(size); + file.read(reinterpret_cast(edid_data.data()), size); + return parse_edid(edid_data.data(), size); +} + +} // namespace EdidParser \ No newline at end of file diff --git a/Virtual Display Driver (HDR)/vdd_settings.xml b/Virtual Display Driver (HDR)/vdd_settings.xml index d70a01d7..ee8aa4d4 100644 --- a/Virtual Display Driver (HDR)/vdd_settings.xml +++ b/Virtual Display Driver (HDR)/vdd_settings.xml @@ -93,5 +93,7 @@ false + false + \ No newline at end of file From cf31b9ae2ba1577720cc68d7fc703ef01f7fb430 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Sandstr=C3=B6m?= Date: Sat, 22 Mar 2025 17:08:10 +0100 Subject: [PATCH 2/6] Better parsing and limiting and sorting of videomodes Limiting the total modes to 92, had issues with to many modes in vddd_settings.xml hindering initializing of VirtualDisplay. When we limit we cut the mode lines over 92, so inorder to let the user chose which modlines to cut we have a sort order. x-desc | x-ass | y-desc| y-ass | ref.rate-desc | ref.rate-ass This is set in vdd_settings.xml, and if the xml is missing the correct tag it will default to x-desc. We also makesure there are no duplicate modelines from edid, like td 1024*768@60 and a identical VIC in CEA block. --- .../MttVDD/Driver.cpp | 79 +++++++++++++++++++ .../MttVDD/edid_parser.cpp | 5 ++ 2 files changed, 84 insertions(+) diff --git a/Virtual Display Driver (HDR)/MttVDD/Driver.cpp b/Virtual Display Driver (HDR)/MttVDD/Driver.cpp index 752cff89..ba5bbba5 100644 --- a/Virtual Display Driver (HDR)/MttVDD/Driver.cpp +++ b/Virtual Display Driver (HDR)/MttVDD/Driver.cpp @@ -37,6 +37,7 @@ Copyright (c) Microsoft Corporation #include #include #include +#include @@ -1494,6 +1495,7 @@ void loadSettings() { const wstring settingsname = confpath + L"\\vdd_settings.xml"; const wstring& filename = settingsname; bool parseEdidRes = false; // Default to false unless specified in XML + wstring resSort; if (PathFileExistsW(filename.c_str())) { CComPtr pStream; @@ -1520,6 +1522,43 @@ void loadSettings() { UINT cwchLocalName; UINT cwchValue; wstring currentElement; + + // Sort and cap monitorModes based on res-sort + if (!monitorModes.empty()) { + // Parse res-sort value + bool descending = resSort.find(L"desc") != wstring::npos; + if (resSort.find(L"x") != wstring::npos) { + std::sort(monitorModes.begin(), monitorModes.end(), + [descending](const tuple& a, const tuple& b) { + return descending ? std::get<0>(a) > std::get<0>(b) : std::get<0>(a) < std::get<0>(b); + }); + } + else if (resSort.find(L"y") != wstring::npos) { + std::sort(monitorModes.begin(), monitorModes.end(), + [descending](const tuple& a, const tuple& b) { + return descending ? std::get<1>(a) > std::get<1>(b) : std::get<1>(a) < std::get<1>(b); + }); + } + else if (resSort.find(L"ref.rate") != wstring::npos) { + std::sort(monitorModes.begin(), monitorModes.end(), + [descending](const tuple& a, const tuple& b) { + return descending ? std::get<2>(a) > std::get<2>(b) : std::get<2>(a) < std::get<2>(b); + }); + } + else { + // Default to x-desc if res-sort is invalid + std::sort(monitorModes.begin(), monitorModes.end(), + [](const tuple& a, const tuple& b) { + return std::get<0>(a) > std::get<0>(b); + }); + } + + // Cap at 92 modes, keeping highest values based on sort + if (monitorModes.size() > 92) { + monitorModes.resize(92); + vddlog("i", "Capped monitorModes to 92, removed lowest-value modes based on sort"); + } + } wstring width, height, refreshRate; vector> res; wstring gpuFriendlyName; @@ -1573,6 +1612,9 @@ void loadSettings() { wstring value(pwszValue, cwchValue); parseEdidRes = (value == L"true" || value == L"1"); // Accept "true" or "1" } + else if (currentElement == L"res-sort") { + resSort = wstring(pwszValue, cwchValue); + } break; } } @@ -1677,6 +1719,43 @@ void loadSettings() { else { vddlog("w", "parse_edid_res is true, but user_edid.bin not found; keeping current modes"); } + // Sort and cap monitorModes to 92, + // Sort based on res-sort in xml, (x-desc | y-ass | ref.rate) defaults to x-desc + if (!monitorModes.empty()) { + // Parse res-sort value + bool descending = resSort.find(L"desc") != wstring::npos; + if (resSort.find(L"x") != wstring::npos) { + std::sort(monitorModes.begin(), monitorModes.end(), + [descending](const tuple& a, const tuple& b) { + return descending ? std::get<0>(a) > std::get<0>(b) : std::get<0>(a) < std::get<0>(b); + }); + } + else if (resSort.find(L"y") != wstring::npos) { + std::sort(monitorModes.begin(), monitorModes.end(), + [descending](const tuple& a, const tuple& b) { + return descending ? std::get<1>(a) > std::get<1>(b) : std::get<1>(a) < std::get<1>(b); + }); + } + else if (resSort.find(L"ref.rate") != wstring::npos) { + std::sort(monitorModes.begin(), monitorModes.end(), + [descending](const tuple& a, const tuple& b) { + return descending ? std::get<2>(a) > std::get<2>(b) : std::get<2>(a) < std::get<2>(b); + }); + } + else { + // Default to x-desc if res-sort is invalid + std::sort(monitorModes.begin(), monitorModes.end(), + [](const tuple& a, const tuple& b) { + return std::get<0>(a) > std::get<0>(b); + }); + } + + // Cap at 92 modes, keeping highest values based on sort + if (monitorModes.size() > 92) { + monitorModes.resize(92); + vddlog("i", "Capped monitorModes to 92, removed lowest-value modes based on sort"); + } + } } } diff --git a/Virtual Display Driver (HDR)/MttVDD/edid_parser.cpp b/Virtual Display Driver (HDR)/MttVDD/edid_parser.cpp index 21927e20..33bb1c88 100644 --- a/Virtual Display Driver (HDR)/MttVDD/edid_parser.cpp +++ b/Virtual Display Driver (HDR)/MttVDD/edid_parser.cpp @@ -4,6 +4,7 @@ #include #include #include +#include namespace EdidParser { @@ -243,6 +244,10 @@ std::vector parse_edid(const uint8_t* edid_data, size_t size) { } } + // Deduplicate modes + std::set uniqueModes(modes.begin(), modes.end()); + modes.assign(uniqueModes.begin(), uniqueModes.end()); + return modes; } From 295b70bf1d2221bf2ce16579902d416906afd11f Mon Sep 17 00:00:00 2001 From: Mike Rodriguez Date: Sat, 22 Mar 2025 10:56:31 -0700 Subject: [PATCH 3/6] Update Driver.cpp --- Virtual Display Driver (HDR)/MttVDD/Driver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Virtual Display Driver (HDR)/MttVDD/Driver.cpp b/Virtual Display Driver (HDR)/MttVDD/Driver.cpp index ba5bbba5..0de24943 100644 --- a/Virtual Display Driver (HDR)/MttVDD/Driver.cpp +++ b/Virtual Display Driver (HDR)/MttVDD/Driver.cpp @@ -1700,7 +1700,7 @@ void loadSettings() { const wstring edidname = confpath + L"\\user_edid.bin"; if (PathFileExistsW(edidname.c_str())) { try { - string edidPath(edidname.begin(), edidname.end()); // Convert wstring to string + string edidPath = WStringToString(edidname); // Convert wstring to string using safe conversion monitorModes = EdidParser::load_and_parse_edid(edidPath); vddlog("i", "Overriding monitor modes with user_edid.bin (parse_edid_res = true)"); for (const auto& mode : monitorModes) { From d514bf0ab4d39f8bea0df192268aa7216d13abd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Sandstr=C3=B6m?= Date: Sat, 22 Mar 2025 20:12:59 +0100 Subject: [PATCH 4/6] Missed the vdd_settings for sort order Forgot to save the file before commit --- Virtual Display Driver (HDR)/vdd_settings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Virtual Display Driver (HDR)/vdd_settings.xml b/Virtual Display Driver (HDR)/vdd_settings.xml index ee8aa4d4..8fe44e32 100644 --- a/Virtual Display Driver (HDR)/vdd_settings.xml +++ b/Virtual Display Driver (HDR)/vdd_settings.xml @@ -96,4 +96,7 @@ false + + + x-desc \ No newline at end of file From d399ebf921314a568fc546f6570e8bc4fd285f61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Sandstr=C3=B6m?= Date: Sat, 22 Mar 2025 23:02:37 +0100 Subject: [PATCH 5/6] Added an exploritory AR-remover from edid Making the RatioLimit true/false in xml. Previous code that might benefit the project is moving and sorting and limiting modes out side of edid_parser --- .../MttVDD/Driver.cpp | 50 +++++-------------- Virtual Display Driver (HDR)/vdd_settings.xml | 2 + 2 files changed, 14 insertions(+), 38 deletions(-) diff --git a/Virtual Display Driver (HDR)/MttVDD/Driver.cpp b/Virtual Display Driver (HDR)/MttVDD/Driver.cpp index 0de24943..c4c3c1d9 100644 --- a/Virtual Display Driver (HDR)/MttVDD/Driver.cpp +++ b/Virtual Display Driver (HDR)/MttVDD/Driver.cpp @@ -100,6 +100,7 @@ bool hardwareCursor = false; bool preventManufacturerSpoof = false; bool edidCeaOverride = false; bool sendLogsThroughPipe = true; +bool PreventARlimit = true; //Mouse settings bool alphaCursorSupport = true; @@ -122,6 +123,7 @@ std::map> SettingsQueryMap = {L"PreventMonitorSpoof", {L"PREVENTMONITORSPOOF", L"PreventSpoof"}}, {L"EdidCeaOverride", {L"EDIDCEAOVERRIDE", L"EdidCeaOverride"}}, {L"SendLogsThroughPipe", {L"SENDLOGSTHROUGHPIPE", L"SendLogsThroughPipe"}}, + {L"PreventARlimit", {L"RMARLIMIT", L"RatioLimit"}}, //Cursor Begin {L"HardwareCursorEnabled", {L"HARDWARECURSOR", L"HardwareCursor"}}, {L"AlphaCursorSupport", {L"ALPHACURSORSUPPORT", L"AlphaCursorSupport"}}, @@ -1430,7 +1432,7 @@ extern "C" NTSTATUS DriverEntry( preventManufacturerSpoof = EnabledQuery(L"PreventMonitorSpoof"); edidCeaOverride = EnabledQuery(L"EdidCeaOverride"); sendLogsThroughPipe = EnabledQuery(L"SendLogsThroughPipe"); - + PreventARlimit = EnabledQuery(L"RatioLimit"); //colour HDRPlus = EnabledQuery(L"HDRPlusEnabled"); @@ -1522,43 +1524,6 @@ void loadSettings() { UINT cwchLocalName; UINT cwchValue; wstring currentElement; - - // Sort and cap monitorModes based on res-sort - if (!monitorModes.empty()) { - // Parse res-sort value - bool descending = resSort.find(L"desc") != wstring::npos; - if (resSort.find(L"x") != wstring::npos) { - std::sort(monitorModes.begin(), monitorModes.end(), - [descending](const tuple& a, const tuple& b) { - return descending ? std::get<0>(a) > std::get<0>(b) : std::get<0>(a) < std::get<0>(b); - }); - } - else if (resSort.find(L"y") != wstring::npos) { - std::sort(monitorModes.begin(), monitorModes.end(), - [descending](const tuple& a, const tuple& b) { - return descending ? std::get<1>(a) > std::get<1>(b) : std::get<1>(a) < std::get<1>(b); - }); - } - else if (resSort.find(L"ref.rate") != wstring::npos) { - std::sort(monitorModes.begin(), monitorModes.end(), - [descending](const tuple& a, const tuple& b) { - return descending ? std::get<2>(a) > std::get<2>(b) : std::get<2>(a) < std::get<2>(b); - }); - } - else { - // Default to x-desc if res-sort is invalid - std::sort(monitorModes.begin(), monitorModes.end(), - [](const tuple& a, const tuple& b) { - return std::get<0>(a) > std::get<0>(b); - }); - } - - // Cap at 92 modes, keeping highest values based on sort - if (monitorModes.size() > 92) { - monitorModes.resize(92); - vddlog("i", "Capped monitorModes to 92, removed lowest-value modes based on sort"); - } - } wstring width, height, refreshRate; vector> res; wstring gpuFriendlyName; @@ -2398,6 +2363,14 @@ void modifyEdid(vector& edid) { edid[11] = 0x13; } +void ARnullEdid(vector& edid) { + if (edid.size() < 12) { + return; + } + + edid[21] = 0x00; + edid[22] = 0x00; +} BYTE calculateChecksum(const std::vector& edid) { @@ -2473,6 +2446,7 @@ int maincalc() { vector edid = loadEdid(WStringToString(confpath) + "\\user_edid.bin"); if (!preventManufacturerSpoof) modifyEdid(edid); + if (!PreventARlimit) ARnullEdid(edid); BYTE checksum = calculateChecksum(edid); edid[127] = checksum; // Setting this variable is depricated, hardcoded edid is either returned or custom in loading edid function diff --git a/Virtual Display Driver (HDR)/vdd_settings.xml b/Virtual Display Driver (HDR)/vdd_settings.xml index 8fe44e32..9b1ae738 100644 --- a/Virtual Display Driver (HDR)/vdd_settings.xml +++ b/Virtual Display Driver (HDR)/vdd_settings.xml @@ -91,6 +91,8 @@ false + true + false false From d763a3682b3a67531fe80e0e30553dfe80417a5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Sandstr=C3=B6m?= Date: Mon, 31 Mar 2025 18:35:32 +0200 Subject: [PATCH 6/6] Built but not tested due to lax of dx11 card After a few weeks of banging my head against the wall to understand the intricate way of trying to get iddcx and dxgi and d3d11 to work together. It finally built, if some one finds the time / want to subject themself to my shitty code =) I'' gladly help you along on our discord. at least sofar that you an compile and test locally. --- Common/Dx11-Shader/TV_shader.cpp | 476 +++++++++++++++++ Common/Dx11-Shader/TV_shader.h | 16 + Common/Include/crt_shader.h | 477 ++++++++++++++++++ Common/Include/frame_handler.h | 33 ++ .../MttVDD/Driver.cpp | 415 +++++++++------ Virtual Display Driver (HDR)/MttVDD/Driver.h | 3 - .../MttVDD/MttVDD.vcxproj | 14 +- .../MttVDD/MttVDD.vcxproj.filters | 5 +- .../MttVDD/frame_handler.cpp | 151 ++++++ Virtual Display Driver (HDR)/MttVDD/globals.h | 11 + Virtual Display Driver (HDR)/vdd_settings.xml | 2 + 11 files changed, 1427 insertions(+), 176 deletions(-) create mode 100644 Common/Dx11-Shader/TV_shader.cpp create mode 100644 Common/Dx11-Shader/TV_shader.h create mode 100644 Common/Include/crt_shader.h create mode 100644 Common/Include/frame_handler.h create mode 100644 Virtual Display Driver (HDR)/MttVDD/frame_handler.cpp create mode 100644 Virtual Display Driver (HDR)/MttVDD/globals.h diff --git a/Common/Dx11-Shader/TV_shader.cpp b/Common/Dx11-Shader/TV_shader.cpp new file mode 100644 index 00000000..c6146b2f --- /dev/null +++ b/Common/Dx11-Shader/TV_shader.cpp @@ -0,0 +1,476 @@ +// TV_shader.cpp +#include "TV_shader.h" + +const int TVShader_VS_size = 3100; +const BYTE TVShader_VS[3100] = {0x44, 0x58, 0x42, 0x43, 0xc4, 0xc2, 0xf2, 0x52, 0x48, 0xf3, 0xa1, 0x52, 0x1d, 0x82, 0x8d, 0xd7, +0xa1, 0xfc, 0xdf, 0xe6, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x0c, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, +0x3c, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00, +0xf0, 0x01, 0x00, 0x00, 0xc8, 0x06, 0x00, 0x00, 0xe4, 0x06, 0x00, 0x00, 0x53, 0x46, 0x49, 0x30, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x53, 0x47, 0x31, +0x5c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x4f, 0x53, 0x49, +0x54, 0x49, 0x4f, 0x4e, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x00, 0x00, +0x4f, 0x53, 0x47, 0x31, 0x60, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x53, 0x56, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x54, 0x45, 0x58, 0x43, +0x4f, 0x4f, 0x52, 0x44, 0x00, 0x00, 0x00, 0x00, 0x50, 0x53, 0x56, 0x30, 0xd0, 0x00, 0x00, 0x00, +0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, +0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, +0x00, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, +0x52, 0x44, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x56, 0x53, 0x4d, 0x61, +0x69, 0x6e, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0x00, 0x03, 0x00, 0x00, 0x00, +0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x42, 0x00, 0x03, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0x03, 0x03, 0x04, 0x00, 0x00, +0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x42, 0x00, 0x03, 0x02, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x53, 0x54, 0x41, 0x54, 0xd0, 0x04, 0x00, 0x00, 0x60, 0x00, 0x01, 0x00, 0x34, 0x01, 0x00, 0x00, +0x44, 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xb8, 0x04, 0x00, 0x00, +0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0x2b, 0x01, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, +0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, +0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, +0x80, 0x10, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0x84, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x4b, +0x0a, 0x32, 0x42, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, +0xe4, 0x48, 0x0e, 0x90, 0x11, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a, +0x04, 0x21, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1b, 0x8c, 0xe0, 0xff, +0xff, 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8, 0x0d, 0x84, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x03, 0x20, +0x01, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x82, 0x60, 0x42, +0x20, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x32, 0x22, 0x08, 0x09, +0x20, 0x64, 0x85, 0x04, 0x13, 0x22, 0xa4, 0x84, 0x04, 0x13, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, +0x12, 0x4c, 0x88, 0x8c, 0x0b, 0x84, 0x84, 0x4c, 0x10, 0x30, 0x23, 0x00, 0x25, 0x00, 0x8a, 0x19, +0x80, 0x39, 0x02, 0x30, 0x98, 0x23, 0x40, 0x8a, 0x31, 0x44, 0x54, 0x44, 0x56, 0x0c, 0x20, 0xa2, +0x1a, 0xc2, 0x81, 0x80, 0x44, 0x20, 0x00, 0x00, 0x13, 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60, 0x87, +0x36, 0x68, 0x87, 0x79, 0x68, 0x03, 0x72, 0xc0, 0x87, 0x0d, 0xaf, 0x50, 0x0e, 0x6d, 0xd0, 0x0e, +0x7a, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, +0x90, 0x0e, 0x71, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x73, 0x20, +0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x30, 0x07, +0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, +0xd0, 0x06, 0xe6, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, +0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, +0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x76, +0x40, 0x07, 0x43, 0x9e, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, +0x3c, 0x06, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x79, 0x10, 0x20, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x02, 0x01, 0x0c, 0x00, 0x00, 0x00, +0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0xa2, +0x12, 0x18, 0x01, 0x28, 0x86, 0x32, 0x28, 0x8f, 0xd2, 0xa0, 0x2a, 0x89, 0x11, 0x80, 0x42, 0x28, +0x82, 0x32, 0xa0, 0x1d, 0x0b, 0x31, 0x8c, 0x40, 0x20, 0x10, 0x08, 0x0c, 0x00, 0x00, 0x00, 0x00, +0x79, 0x18, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0xc4, +0x8e, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45, 0x86, 0x06, 0xe6, 0xc6, +0xe5, 0x06, 0x04, 0x85, 0x26, 0xc6, 0xc6, 0x2c, 0x4c, 0xcc, 0x46, 0xac, 0x26, 0x65, 0x43, 0x10, +0x4c, 0x10, 0x88, 0x61, 0x82, 0x40, 0x10, 0x1b, 0x84, 0x81, 0xd8, 0x20, 0x10, 0x04, 0x05, 0xbb, +0xb9, 0x09, 0x02, 0x51, 0x6c, 0x18, 0x0e, 0x84, 0x98, 0x20, 0x08, 0xc0, 0x06, 0x60, 0xc3, 0x40, +0x2c, 0xcb, 0x86, 0x80, 0xd9, 0x30, 0x0c, 0x4a, 0x33, 0x41, 0x58, 0x9c, 0x0d, 0xc1, 0x43, 0xc3, +0x6a, 0xaa, 0x29, 0x2c, 0xcd, 0x8d, 0x08, 0xd4, 0xd3, 0x54, 0x12, 0x55, 0xd2, 0x93, 0xd3, 0x04, +0xa1, 0x48, 0x26, 0x08, 0x85, 0xb2, 0x21, 0x20, 0x26, 0x08, 0xc5, 0x32, 0x41, 0x20, 0x8c, 0x09, +0x02, 0x71, 0x6c, 0x10, 0x2e, 0x6c, 0xc3, 0x42, 0x48, 0x13, 0x55, 0x51, 0x83, 0x45, 0x50, 0x19, +0x11, 0xaa, 0x22, 0xac, 0xa1, 0xa7, 0x27, 0x29, 0xa2, 0x09, 0x42, 0xc1, 0x6c, 0x10, 0xae, 0x6b, +0xc3, 0x32, 0x6c, 0x13, 0x55, 0x51, 0x03, 0x37, 0x50, 0xdd, 0x06, 0x41, 0xf3, 0xb8, 0x4c, 0x59, +0x7d, 0x41, 0xbd, 0xcd, 0xa5, 0xd1, 0xa5, 0xbd, 0xb9, 0x4d, 0x10, 0x8a, 0x66, 0xc3, 0x42, 0x80, +0xc1, 0x14, 0x06, 0x95, 0x35, 0x58, 0x04, 0x95, 0x6d, 0x58, 0x86, 0x6d, 0xa2, 0x2a, 0x6e, 0xe0, +0x06, 0xaa, 0xdb, 0x20, 0x88, 0xc1, 0x18, 0x6c, 0x18, 0x3e, 0x32, 0x00, 0x36, 0x14, 0x4a, 0x54, +0x06, 0x00, 0xc0, 0x22, 0xcd, 0x6d, 0x8e, 0x6e, 0x6e, 0x82, 0x40, 0x20, 0x34, 0xe6, 0xd2, 0xce, +0xbe, 0xd8, 0xc8, 0x68, 0xcc, 0xa5, 0x9d, 0x7d, 0xcd, 0xd1, 0x6d, 0x30, 0xce, 0x00, 0x0d, 0xd2, +0x00, 0x51, 0x03, 0xa4, 0x0a, 0x1b, 0x9b, 0x5d, 0x9b, 0x4b, 0x1a, 0x59, 0x99, 0x1b, 0xdd, 0x94, +0x20, 0xa8, 0x42, 0x86, 0xe7, 0x62, 0x57, 0x26, 0x37, 0x97, 0xf6, 0xe6, 0x36, 0x25, 0x20, 0x9a, +0x90, 0xe1, 0xb9, 0xd8, 0x85, 0xb1, 0xd9, 0x95, 0xc9, 0x4d, 0x09, 0x8a, 0x3a, 0x64, 0x78, 0x2e, +0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x02, 0xa4, 0x12, 0x19, +0x9e, 0x0b, 0x5d, 0x1e, 0x5c, 0x59, 0x90, 0x9b, 0xdb, 0x1b, 0x5d, 0x18, 0x5d, 0xda, 0x9b, 0xdb, +0xdc, 0x94, 0xa0, 0xa9, 0x43, 0x86, 0xe7, 0x62, 0x97, 0x56, 0x76, 0x97, 0x44, 0x36, 0x45, 0x17, +0x46, 0x57, 0x36, 0x25, 0x78, 0xea, 0x90, 0xe1, 0xb9, 0x94, 0xb9, 0xd1, 0xc9, 0xe5, 0x41, 0xbd, +0xa5, 0xb9, 0xd1, 0xcd, 0x4d, 0x09, 0xca, 0xa0, 0x0b, 0x19, 0x9e, 0xcb, 0xd8, 0x5b, 0x9d, 0x1b, +0x5d, 0x99, 0xdc, 0xdc, 0x94, 0x40, 0x0d, 0x00, 0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, +0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, +0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, +0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, +0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, +0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, +0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, +0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, +0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, +0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, +0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, +0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, +0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, +0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, +0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, +0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, +0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, +0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70, 0x03, 0x72, 0x10, 0x87, +0x73, 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60, 0x87, 0x70, 0xc8, 0x87, 0x77, 0xa8, 0x07, 0x7a, +0x98, 0x81, 0x3c, 0xe4, 0x80, 0x0f, 0x6e, 0x40, 0x0f, 0xe5, 0xd0, 0x0e, 0xf0, 0x00, 0x00, 0x00, +0x71, 0x20, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x06, 0x60, 0xbc, 0xac, 0x09, 0x20, 0x8d, 0x05, +0x4c, 0xc3, 0xe5, 0x3b, 0x8f, 0xbf, 0x38, 0xc0, 0x20, 0x36, 0x0f, 0x35, 0xf9, 0xc5, 0x6d, 0x9b, +0x40, 0x35, 0x5c, 0xbe, 0xf3, 0xf8, 0xd2, 0xe4, 0x44, 0x04, 0x4a, 0x4d, 0x0f, 0x35, 0xf9, 0xc5, +0x6d, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x14, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xbb, 0xc1, 0x02, 0x5d, 0x6d, 0x5c, 0x1a, 0xd9, 0x80, 0x51, 0xe1, 0xc6, +0x68, 0x94, 0x65, 0x78, 0x44, 0x58, 0x49, 0x4c, 0x30, 0x05, 0x00, 0x00, 0x60, 0x00, 0x01, 0x00, +0x4c, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x18, 0x05, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0x43, 0x01, 0x00, 0x00, +0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, +0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, +0x1e, 0x04, 0x8b, 0x62, 0x80, 0x10, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0x84, 0x10, 0x32, 0x14, +0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x42, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5, +0x00, 0x19, 0x32, 0x42, 0xe4, 0x48, 0x0e, 0x90, 0x11, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, +0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x21, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, +0x1b, 0x8c, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8, 0x0d, 0x84, 0xf0, 0xff, 0xff, +0xff, 0xff, 0x03, 0x20, 0x01, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x13, 0x82, 0x60, 0x42, 0x20, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, +0x32, 0x22, 0x08, 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x22, 0xa4, 0x84, 0x04, 0x13, 0x22, 0xe3, +0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x88, 0x8c, 0x0b, 0x84, 0x84, 0x4c, 0x10, 0x30, 0x23, 0x00, +0x25, 0x00, 0x8a, 0x19, 0x80, 0x39, 0x02, 0x30, 0x98, 0x23, 0x40, 0x8a, 0x31, 0x44, 0x54, 0x44, +0x56, 0x0c, 0x20, 0xa2, 0x1a, 0xc2, 0x81, 0x80, 0x44, 0x20, 0x00, 0x00, 0x13, 0x14, 0x72, 0xc0, +0x87, 0x74, 0x60, 0x87, 0x36, 0x68, 0x87, 0x79, 0x68, 0x03, 0x72, 0xc0, 0x87, 0x0d, 0xaf, 0x50, +0x0e, 0x6d, 0xd0, 0x0e, 0x7a, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, +0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x78, +0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, +0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, +0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, +0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, +0x07, 0x76, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, +0x72, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x43, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x86, 0x3c, 0x06, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0c, 0x79, 0x10, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x02, 0x01, +0x0c, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, +0xc6, 0x04, 0x43, 0xa2, 0x12, 0x18, 0x01, 0x28, 0x88, 0x62, 0x28, 0x83, 0xf2, 0xa0, 0x2a, 0x89, +0x11, 0x80, 0x42, 0x28, 0x82, 0x32, 0xa0, 0x1d, 0x0b, 0x31, 0x8c, 0x40, 0x20, 0x10, 0x08, 0x0c, +0x00, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, +0x46, 0x02, 0x13, 0xc4, 0x8e, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45, +0x86, 0x06, 0xe6, 0xc6, 0xe5, 0x06, 0x04, 0x85, 0x26, 0xc6, 0xc6, 0x2c, 0x4c, 0xcc, 0x46, 0xac, +0x26, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x88, 0x61, 0x82, 0x40, 0x10, 0x1b, 0x84, 0x81, 0x98, 0x20, +0x10, 0xc5, 0x06, 0x61, 0x30, 0x28, 0xd8, 0xcd, 0x4d, 0x10, 0x08, 0x63, 0xc3, 0x80, 0x24, 0xc4, +0x04, 0x61, 0x71, 0x36, 0x04, 0xcb, 0x04, 0x41, 0x00, 0x68, 0x58, 0x4d, 0x35, 0x85, 0xa5, 0xb9, +0x11, 0x81, 0x7a, 0x9a, 0x4a, 0xa2, 0x4a, 0x7a, 0x72, 0x9a, 0x20, 0x14, 0xc9, 0x04, 0xa1, 0x50, +0x36, 0x04, 0xc4, 0x04, 0xa1, 0x58, 0x26, 0x08, 0xc4, 0x31, 0x41, 0x20, 0x90, 0x0d, 0x02, 0x55, +0x6d, 0x58, 0x88, 0x07, 0x8a, 0xa4, 0x68, 0x98, 0x88, 0xc8, 0x22, 0x42, 0x55, 0x84, 0x35, 0xf4, +0xf4, 0x24, 0x45, 0x34, 0x41, 0x28, 0x98, 0x0d, 0x02, 0x45, 0x6d, 0x58, 0x06, 0x0c, 0x8a, 0xa4, +0x68, 0xc8, 0x86, 0x48, 0xdb, 0x20, 0x5c, 0x1b, 0x97, 0x29, 0xab, 0x2f, 0xa8, 0xb7, 0xb9, 0x34, +0xba, 0xb4, 0x37, 0xb7, 0x09, 0x42, 0xd1, 0x6c, 0x58, 0x88, 0x0e, 0xf2, 0xa4, 0x69, 0x98, 0x88, +0xc8, 0xda, 0xb0, 0x0c, 0x18, 0x14, 0x49, 0xd9, 0x90, 0x0d, 0x91, 0xb6, 0x41, 0xf8, 0xc0, 0x60, +0xc3, 0xc0, 0x85, 0x01, 0xb0, 0xa1, 0x68, 0x1c, 0x31, 0x00, 0x80, 0x2a, 0x6c, 0x6c, 0x76, 0x6d, +0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x53, 0x82, 0xa0, 0x0a, 0x19, 0x9e, 0x8b, 0x5d, 0x99, 0xdc, +0x5c, 0xda, 0x9b, 0xdb, 0x94, 0x80, 0x68, 0x42, 0x86, 0xe7, 0x62, 0x17, 0xc6, 0x66, 0x57, 0x26, +0x37, 0x25, 0x30, 0xea, 0x90, 0xe1, 0xb9, 0xcc, 0xa1, 0x85, 0x91, 0x95, 0xc9, 0x35, 0xbd, 0x91, +0x95, 0xb1, 0x4d, 0x09, 0x92, 0x3a, 0x64, 0x78, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x49, 0x64, 0x53, +0x74, 0x61, 0x74, 0x65, 0x53, 0x82, 0xa5, 0x0e, 0x19, 0x9e, 0x4b, 0x99, 0x1b, 0x9d, 0x5c, 0x1e, +0xd4, 0x5b, 0x9a, 0x1b, 0xdd, 0xdc, 0x94, 0x40, 0x0c, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, +0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, +0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, +0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, +0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, +0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, +0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, +0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, +0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, +0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, +0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, +0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, +0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, +0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, +0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, +0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, +0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, +0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70, +0x03, 0x72, 0x10, 0x87, 0x73, 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60, 0x87, 0x70, 0xc8, 0x87, +0x77, 0xa8, 0x07, 0x7a, 0x98, 0x81, 0x3c, 0xe4, 0x80, 0x0f, 0x6e, 0x40, 0x0f, 0xe5, 0xd0, 0x0e, +0xf0, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x06, 0x60, 0xbc, 0xac, +0x09, 0x20, 0x8d, 0x05, 0x4c, 0xc3, 0xe5, 0x3b, 0x8f, 0xbf, 0x38, 0xc0, 0x20, 0x36, 0x0f, 0x35, +0xf9, 0xc5, 0x6d, 0x9b, 0x40, 0x35, 0x5c, 0xbe, 0xf3, 0xf8, 0xd2, 0xe4, 0x44, 0x04, 0x4a, 0x4d, +0x0f, 0x35, 0xf9, 0xc5, 0x6d, 0x03, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, +0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x44, 0x85, 0x30, 0x03, +0x50, 0x0a, 0x54, 0x25, 0x00, 0x00, 0x00, 0x00, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0x48, +0x04, 0xf4, 0x24, 0xc3, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x18, 0x53, 0x11, 0x41, 0x02, 0x31, +0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x06, 0x65, 0x44, 0xd1, 0x52, 0x8c, 0x18, 0x24, 0x00, 0x08, +0x82, 0x81, 0x51, 0x1d, 0x92, 0x44, 0x18, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0x58, 0xc8, +0x34, 0x2d, 0xc7, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x18, 0x57, 0x42, 0x51, 0x0b, 0x32, 0x62, +0x90, 0x00, 0x20, 0x08, 0x06, 0xc8, 0x85, 0x54, 0xd5, 0x43, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, +0x01, 0x72, 0x21, 0x55, 0x75, 0x0c, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x80, 0x5c, 0x48, 0x55, +0x35, 0xc2, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x20, 0x17, 0x52, 0x55, 0x4c, 0x30, 0x62, 0x90, +0x00, 0x20, 0x08, 0x06, 0xc8, 0x85, 0x58, 0xd5, 0x63, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x01, +0x72, 0x21, 0x56, 0x75, 0x14, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +const int TVShader_PS_size = 4412; +const BYTE TVShader_PS[4412] = {0x44, 0x58, 0x42, 0x43, 0x3f, 0x2b, 0xee, 0x8e, 0x04, 0x44, 0xe1, 0xcb, 0xc2, 0x11, 0xfd, 0x4d, +0x32, 0x0b, 0x9e, 0x89, 0x01, 0x00, 0x00, 0x00, 0x3c, 0x11, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, +0x3c, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, +0xf4, 0x01, 0x00, 0x00, 0x58, 0x09, 0x00, 0x00, 0x74, 0x09, 0x00, 0x00, 0x53, 0x46, 0x49, 0x30, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x53, 0x47, 0x31, +0x60, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x56, 0x5f, 0x50, +0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, +0x00, 0x00, 0x00, 0x00, 0x4f, 0x53, 0x47, 0x31, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x00, 0x00, 0x00, +0x50, 0x53, 0x56, 0x30, 0xfc, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, +0x03, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x14, 0x00, 0x00, 0x00, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x50, 0x53, +0x4d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0x03, +0x03, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x42, 0x00, +0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0x10, +0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x53, 0x54, 0x41, 0x54, 0x5c, 0x07, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, +0xd7, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x44, 0x07, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0xce, 0x01, 0x00, 0x00, +0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, +0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, +0x1e, 0x04, 0x8b, 0x62, 0x80, 0x18, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32, 0x14, +0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x62, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5, +0x00, 0x19, 0x32, 0x42, 0xe4, 0x48, 0x0e, 0x90, 0x11, 0x23, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, +0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x31, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x1b, 0x8c, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8, 0x0d, 0x84, 0xf0, 0xff, 0xff, +0xff, 0xff, 0x03, 0x20, 0x6d, 0x30, 0x86, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x09, 0xa8, 0x00, +0x49, 0x18, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x13, 0x82, 0x60, 0x42, 0x20, 0x4c, 0x08, 0x06, +0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88, 0x09, +0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, 0x14, +0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0x84, 0xc1, 0x08, 0x40, 0x09, 0x00, 0x0a, +0x66, 0x00, 0xe6, 0x08, 0xc0, 0x60, 0x8e, 0x00, 0x29, 0xc6, 0x40, 0x10, 0x44, 0x41, 0x90, 0x51, +0x0c, 0x80, 0x20, 0x88, 0x62, 0x20, 0xe4, 0xa6, 0xe1, 0xf2, 0x27, 0xec, 0x21, 0x24, 0x7f, 0x25, +0xa4, 0x95, 0x98, 0xfc, 0xe2, 0xb6, 0x51, 0x31, 0x0c, 0xc3, 0x40, 0x50, 0x71, 0xcf, 0x70, 0xf9, +0x13, 0xf6, 0x10, 0x92, 0x1f, 0x02, 0xcd, 0xb0, 0x10, 0x28, 0x58, 0x0a, 0xa3, 0x10, 0x0c, 0x33, +0x0c, 0xc3, 0x40, 0x10, 0xc4, 0x40, 0x4d, 0x19, 0x06, 0x62, 0xa0, 0xe7, 0xa8, 0xe1, 0xf2, 0x27, +0xec, 0x21, 0x24, 0x9f, 0xdb, 0xa8, 0x62, 0x25, 0x26, 0xbf, 0xb8, 0x6d, 0x44, 0x0c, 0xc3, 0x30, +0x14, 0x22, 0x22, 0x18, 0x82, 0xa4, 0x39, 0x82, 0xa0, 0x18, 0x0c, 0x51, 0x10, 0x04, 0x45, 0xd5, +0x40, 0xc0, 0x30, 0x02, 0x31, 0xcc, 0xd4, 0x06, 0xe3, 0xc0, 0x0e, 0xe1, 0x30, 0x0f, 0xf3, 0xe0, +0x06, 0xb4, 0x50, 0x0e, 0xf8, 0x40, 0x0f, 0xf5, 0x20, 0x0f, 0xe5, 0x20, 0x07, 0xa4, 0xc0, 0x07, +0xf6, 0x50, 0x0e, 0xe3, 0x40, 0x0f, 0xef, 0x20, 0x0f, 0x7c, 0x60, 0x0e, 0xec, 0xf0, 0x0e, 0xe1, +0x40, 0x0f, 0x6c, 0x00, 0x06, 0x74, 0xe0, 0x07, 0x60, 0xe0, 0x07, 0x7a, 0xa0, 0x07, 0xed, 0x90, +0x0e, 0xf0, 0x30, 0x0f, 0xbf, 0x40, 0x0f, 0xf9, 0x00, 0x0f, 0xe5, 0x80, 0x02, 0x62, 0x26, 0x31, +0x18, 0x07, 0x76, 0x08, 0x87, 0x79, 0x98, 0x07, 0x37, 0xa0, 0x85, 0x72, 0xc0, 0x07, 0x7a, 0xa8, +0x07, 0x79, 0x28, 0x07, 0x39, 0x20, 0x05, 0x3e, 0xb0, 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07, +0x79, 0xe0, 0x03, 0x73, 0x60, 0x87, 0x77, 0x08, 0x07, 0x7a, 0x60, 0x03, 0x30, 0xa0, 0x03, 0x3f, +0x00, 0x03, 0x3f, 0x40, 0x02, 0x96, 0x91, 0x76, 0x4e, 0x4a, 0x44, 0x5f, 0x04, 0x30, 0xc4, 0x46, +0x15, 0x05, 0x11, 0x21, 0x01, 0x1b, 0x88, 0xbb, 0x49, 0x9a, 0x22, 0x4a, 0x98, 0x7c, 0x16, 0x60, +0x9e, 0x85, 0x88, 0xd8, 0x09, 0x98, 0x08, 0x14, 0x10, 0xe4, 0x25, 0x02, 0x01, 0x00, 0x00, 0x00, +0x13, 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60, 0x87, 0x36, 0x68, 0x87, 0x79, 0x68, 0x03, 0x72, 0xc0, +0x87, 0x0d, 0xaf, 0x50, 0x0e, 0x6d, 0xd0, 0x0e, 0x7a, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30, +0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x73, 0x20, 0x07, +0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, +0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, +0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x10, 0x07, 0x76, 0xa0, 0x07, +0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, +0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, +0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x43, 0x9e, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x3c, 0x06, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0c, 0x79, 0x10, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x18, 0xf2, 0x34, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe4, +0x79, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xc8, 0x23, 0x01, 0x01, +0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x90, 0xa7, 0x02, 0x02, 0x60, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2c, 0x10, 0x13, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x18, +0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x22, 0x4a, 0x60, 0x04, 0xa0, +0x18, 0x8a, 0xa0, 0x24, 0x0a, 0xa5, 0x0c, 0xca, 0xa1, 0x34, 0x0a, 0xa1, 0x40, 0xca, 0xa3, 0x8c, +0xa8, 0x28, 0x89, 0x32, 0x28, 0x84, 0x11, 0x80, 0x22, 0x28, 0x10, 0xa2, 0x6a, 0x80, 0xb6, 0x19, +0x00, 0xe2, 0x66, 0x00, 0xa8, 0x9b, 0x01, 0xa0, 0x6f, 0x06, 0x80, 0xc0, 0xb1, 0x10, 0x83, 0x00, +0x00, 0x00, 0x78, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, +0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0xc4, 0x8e, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24, +0xc6, 0x05, 0xc7, 0x45, 0x86, 0x06, 0xe6, 0xc6, 0xe5, 0x06, 0x04, 0x85, 0x26, 0xc6, 0xc6, 0x2c, +0x4c, 0xcc, 0x46, 0xac, 0x26, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x88, 0x63, 0x82, 0x40, 0x20, 0x1b, +0x84, 0x81, 0xd8, 0x20, 0x10, 0x04, 0x05, 0xb8, 0xb9, 0x09, 0x02, 0x91, 0x6c, 0x18, 0x0e, 0x84, +0x98, 0x20, 0x6c, 0x1b, 0x9d, 0xb3, 0xaf, 0x24, 0x37, 0xb8, 0x3a, 0x3a, 0xaa, 0x32, 0x3c, 0xba, +0x3a, 0xb9, 0xb2, 0x09, 0x02, 0xa1, 0x4c, 0x10, 0x88, 0x65, 0x83, 0x40, 0x34, 0x1b, 0x12, 0x42, +0x59, 0x08, 0x62, 0x60, 0x08, 0x67, 0x43, 0xf0, 0x4c, 0x10, 0xba, 0x8e, 0x0e, 0x54, 0x99, 0x9c, +0x91, 0x5c, 0x58, 0x5b, 0x99, 0x50, 0x9d, 0x99, 0x59, 0x99, 0xdc, 0x04, 0x81, 0x60, 0x36, 0x20, +0x44, 0x24, 0x11, 0xc4, 0x30, 0x01, 0x1b, 0x02, 0x6a, 0x82, 0xf0, 0x79, 0x4c, 0xce, 0xbe, 0xa6, +0xc2, 0xda, 0xe0, 0xd8, 0xca, 0xe4, 0x36, 0x20, 0x84, 0x75, 0x11, 0xc4, 0x40, 0x00, 0x1b, 0x02, +0x6c, 0x03, 0x01, 0x01, 0x55, 0x36, 0x41, 0xe0, 0x38, 0x32, 0x75, 0x5f, 0x72, 0x65, 0x73, 0x6f, +0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x13, 0x04, 0xa2, 0x99, 0x20, 0x10, 0xce, 0x04, 0x81, 0xd2, +0x26, 0x08, 0xc4, 0x33, 0x41, 0x20, 0xa0, 0x0d, 0x0a, 0xc2, 0x75, 0x84, 0xd7, 0x34, 0x1f, 0x18, +0x84, 0x01, 0x8d, 0xba, 0x2f, 0xba, 0xb4, 0xb6, 0xb2, 0x09, 0x02, 0x11, 0x6d, 0x40, 0x90, 0x31, +0xe8, 0xc8, 0xc0, 0x6b, 0x9a, 0x6f, 0xc3, 0x30, 0x89, 0x41, 0x19, 0x6c, 0x18, 0x88, 0xcd, 0x0c, +0x26, 0x08, 0x02, 0xb0, 0x01, 0xd8, 0x30, 0x10, 0x69, 0x90, 0x06, 0x1b, 0x02, 0x35, 0xd8, 0x30, +0x0c, 0x68, 0xb0, 0x06, 0x13, 0x04, 0x30, 0xf8, 0x36, 0x04, 0x6d, 0x40, 0x03, 0x6a, 0xaa, 0x29, +0x2c, 0xcd, 0x8d, 0xcb, 0x94, 0xd5, 0x17, 0xd4, 0xdb, 0x5c, 0x1a, 0x5d, 0xda, 0x9b, 0xdb, 0x04, +0xa1, 0xa0, 0x26, 0x08, 0x45, 0xb5, 0x21, 0x20, 0x26, 0x08, 0x85, 0x35, 0x41, 0x28, 0xae, 0x0d, +0x0b, 0x01, 0x07, 0x71, 0x20, 0x07, 0x73, 0x40, 0x07, 0x03, 0x1d, 0x10, 0x75, 0x00, 0x10, 0xa1, +0x2a, 0xc2, 0x1a, 0x7a, 0x7a, 0x92, 0x22, 0x9a, 0x20, 0x14, 0xd8, 0x06, 0xa1, 0xeb, 0x36, 0x2c, +0xc3, 0x1d, 0xc4, 0x41, 0x1d, 0xcc, 0x01, 0x1e, 0x0c, 0x78, 0x30, 0xd4, 0x41, 0x1e, 0x6c, 0x10, +0xec, 0x40, 0x0f, 0x98, 0x4c, 0x59, 0x7d, 0x51, 0x85, 0xc9, 0x9d, 0x95, 0xd1, 0x4d, 0x10, 0x8a, +0x6c, 0x82, 0x40, 0x48, 0x1b, 0x84, 0xce, 0x0f, 0x36, 0x2c, 0x04, 0x1f, 0xc4, 0x41, 0x1f, 0xcc, +0x41, 0x1d, 0x0c, 0x74, 0x40, 0xd4, 0xc1, 0x1f, 0x6c, 0x08, 0x40, 0x61, 0xc3, 0xb0, 0x07, 0xa1, +0x00, 0x6c, 0x28, 0xd0, 0xe0, 0x0d, 0x44, 0x41, 0x03, 0x68, 0x98, 0xb1, 0xbd, 0x85, 0xd1, 0xcd, +0xb1, 0x48, 0x73, 0x9b, 0xa3, 0x9b, 0x9b, 0x20, 0x10, 0x13, 0x8d, 0xb9, 0xb4, 0xb3, 0x2f, 0x36, +0x32, 0x1a, 0x73, 0x69, 0x67, 0x5f, 0x73, 0x74, 0x44, 0xe8, 0xca, 0xf0, 0xbe, 0xdc, 0xde, 0xe4, +0xda, 0x36, 0x28, 0xa4, 0x40, 0x06, 0xa5, 0x60, 0x0a, 0xa7, 0xc0, 0xa0, 0x42, 0x18, 0xa4, 0xc2, +0x50, 0x85, 0x8d, 0xcd, 0xae, 0xcd, 0x25, 0x8d, 0xac, 0xcc, 0x8d, 0x6e, 0x4a, 0x10, 0x54, 0x21, +0xc3, 0x73, 0xb1, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x9b, 0x12, 0x10, 0x4d, 0xc8, 0xf0, 0x5c, +0xec, 0xc2, 0xd8, 0xec, 0xca, 0xe4, 0xa6, 0x04, 0x45, 0x1d, 0x32, 0x3c, 0x97, 0x39, 0xb4, 0x30, +0xb2, 0x32, 0xb9, 0xa6, 0x37, 0xb2, 0x32, 0xb6, 0x29, 0x01, 0x52, 0x86, 0x0c, 0xcf, 0x45, 0xae, +0x6c, 0xee, 0xad, 0x4e, 0x6e, 0xac, 0x6c, 0x6e, 0x4a, 0x90, 0x55, 0x22, 0xc3, 0x73, 0xa1, 0xcb, +0x83, 0x2b, 0x0b, 0x72, 0x73, 0x7b, 0xa3, 0x0b, 0xa3, 0x4b, 0x7b, 0x73, 0x9b, 0x9b, 0x22, 0x98, +0xc1, 0x1a, 0xd4, 0x21, 0xc3, 0x73, 0xb1, 0x4b, 0x2b, 0xbb, 0x4b, 0x22, 0x9b, 0xa2, 0x0b, 0xa3, +0x2b, 0x9b, 0x12, 0xb4, 0x41, 0x1d, 0x32, 0x3c, 0x97, 0x32, 0x37, 0x3a, 0xb9, 0x3c, 0xa8, 0xb7, +0x34, 0x37, 0xba, 0xb9, 0x29, 0x81, 0x28, 0x74, 0x21, 0xc3, 0x73, 0x19, 0x7b, 0xab, 0x73, 0xa3, +0x2b, 0x93, 0x9b, 0x9b, 0x12, 0xa4, 0x02, 0x00, 0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, +0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, +0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, +0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, +0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, +0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, +0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, +0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, +0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, +0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, +0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, +0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, +0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, +0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, +0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, +0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, +0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, +0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, 0xc4, 0x21, 0x07, 0x7c, 0x70, 0x03, 0x7a, 0x28, 0x87, +0x76, 0x80, 0x87, 0x19, 0xd1, 0x43, 0x0e, 0xf8, 0xe0, 0x06, 0xe4, 0x20, 0x0e, 0xe7, 0xe0, 0x06, +0xf6, 0x10, 0x0e, 0xf2, 0xc0, 0x0e, 0xe1, 0x90, 0x0f, 0xef, 0x50, 0x0f, 0xf4, 0x00, 0x00, 0x00, +0x71, 0x20, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x06, 0x60, 0xa4, 0xac, 0x09, 0x20, 0x8d, 0x15, +0x6c, 0xc3, 0xe5, 0x3b, 0x8f, 0x2f, 0x04, 0x54, 0x51, 0x10, 0x51, 0xe9, 0x00, 0x43, 0x49, 0x18, +0x80, 0x80, 0xf9, 0xc5, 0x6d, 0x9b, 0x81, 0x34, 0x5c, 0xbe, 0xf3, 0xf8, 0x42, 0x44, 0x00, 0x13, +0x11, 0x02, 0xcd, 0xb0, 0x10, 0x16, 0x30, 0x0d, 0x97, 0xef, 0x3c, 0xfe, 0xe2, 0x00, 0x83, 0xd8, +0x3c, 0xd4, 0xe4, 0x17, 0xb7, 0x6d, 0x03, 0xd0, 0x70, 0xf9, 0xce, 0xe3, 0x4b, 0x00, 0xf3, 0x2c, +0x84, 0x5f, 0xdc, 0xb6, 0x09, 0x54, 0xc3, 0xe5, 0x3b, 0x8f, 0x2f, 0x4d, 0x4e, 0x44, 0xa0, 0xd4, +0xf4, 0x50, 0x93, 0x5f, 0xdc, 0xb6, 0x11, 0x3c, 0xc3, 0xe5, 0x3b, 0x8f, 0x4f, 0x35, 0x40, 0x84, +0xf9, 0xc5, 0x6d, 0x03, 0x00, 0x00, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x14, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xbe, 0x2c, 0xdc, 0x30, 0x8e, 0xe9, 0x09, 0x0c, 0xa6, 0xa7, 0x08, 0x00, +0xa4, 0x3e, 0xb3, 0xff, 0x44, 0x58, 0x49, 0x4c, 0xc0, 0x07, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, +0xf0, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0xa8, 0x07, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0xe7, 0x01, 0x00, 0x00, +0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, +0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, +0x1e, 0x04, 0x8b, 0x62, 0x80, 0x18, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32, 0x14, +0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x62, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5, +0x00, 0x19, 0x32, 0x42, 0xe4, 0x48, 0x0e, 0x90, 0x11, 0x23, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, +0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x31, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x1b, 0x8c, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8, 0x0d, 0x84, 0xf0, 0xff, 0xff, +0xff, 0xff, 0x03, 0x20, 0x6d, 0x30, 0x86, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x09, 0xa8, 0x00, +0x49, 0x18, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x13, 0x82, 0x60, 0x42, 0x20, 0x4c, 0x08, 0x06, +0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88, 0x09, +0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, 0x14, +0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0x84, 0xc1, 0x08, 0x40, 0x09, 0x00, 0x0a, +0x66, 0x00, 0xe6, 0x08, 0xc0, 0x60, 0x8e, 0x00, 0x29, 0xc6, 0x40, 0x10, 0x44, 0x41, 0x90, 0x51, +0x0c, 0x80, 0x20, 0x88, 0x62, 0x20, 0xe4, 0xa6, 0xe1, 0xf2, 0x27, 0xec, 0x21, 0x24, 0x7f, 0x25, +0xa4, 0x95, 0x98, 0xfc, 0xe2, 0xb6, 0x51, 0x31, 0x0c, 0xc3, 0x40, 0x50, 0x71, 0xcf, 0x70, 0xf9, +0x13, 0xf6, 0x10, 0x92, 0x1f, 0x02, 0xcd, 0xb0, 0x10, 0x28, 0x58, 0x0a, 0xa3, 0x10, 0x0c, 0x33, +0x0c, 0xc3, 0x40, 0x10, 0xc4, 0x40, 0x4d, 0x19, 0x06, 0x62, 0xa0, 0xe7, 0xa8, 0xe1, 0xf2, 0x27, +0xec, 0x21, 0x24, 0x9f, 0xdb, 0xa8, 0x62, 0x25, 0x26, 0xbf, 0xb8, 0x6d, 0x44, 0x0c, 0xc3, 0x30, +0x14, 0x22, 0x22, 0x18, 0x82, 0xa4, 0x39, 0x82, 0xa0, 0x18, 0x0c, 0x51, 0x10, 0x04, 0x45, 0xd5, +0x40, 0xc0, 0x30, 0x02, 0x31, 0xcc, 0xd4, 0x06, 0xe3, 0xc0, 0x0e, 0xe1, 0x30, 0x0f, 0xf3, 0xe0, +0x06, 0xb4, 0x50, 0x0e, 0xf8, 0x40, 0x0f, 0xf5, 0x20, 0x0f, 0xe5, 0x20, 0x07, 0xa4, 0xc0, 0x07, +0xf6, 0x50, 0x0e, 0xe3, 0x40, 0x0f, 0xef, 0x20, 0x0f, 0x7c, 0x60, 0x0e, 0xec, 0xf0, 0x0e, 0xe1, +0x40, 0x0f, 0x6c, 0x00, 0x06, 0x74, 0xe0, 0x07, 0x60, 0xe0, 0x07, 0x7a, 0xa0, 0x07, 0xed, 0x90, +0x0e, 0xf0, 0x30, 0x0f, 0xbf, 0x40, 0x0f, 0xf9, 0x00, 0x0f, 0xe5, 0x80, 0x02, 0x62, 0x26, 0x31, +0x18, 0x07, 0x76, 0x08, 0x87, 0x79, 0x98, 0x07, 0x37, 0xa0, 0x85, 0x72, 0xc0, 0x07, 0x7a, 0xa8, +0x07, 0x79, 0x28, 0x07, 0x39, 0x20, 0x05, 0x3e, 0xb0, 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07, +0x79, 0xe0, 0x03, 0x73, 0x60, 0x87, 0x77, 0x08, 0x07, 0x7a, 0x60, 0x03, 0x30, 0xa0, 0x03, 0x3f, +0x00, 0x03, 0x3f, 0x40, 0x02, 0x96, 0x91, 0x76, 0x4e, 0x4a, 0x44, 0x5f, 0x04, 0x30, 0xc4, 0x46, +0x15, 0x05, 0x11, 0x21, 0x01, 0x1b, 0x88, 0xbb, 0x49, 0x9a, 0x22, 0x4a, 0x98, 0x7c, 0x16, 0x60, +0x9e, 0x85, 0x88, 0xd8, 0x09, 0x98, 0x08, 0x14, 0x10, 0xe4, 0x25, 0x02, 0x01, 0x00, 0x00, 0x00, +0x13, 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60, 0x87, 0x36, 0x68, 0x87, 0x79, 0x68, 0x03, 0x72, 0xc0, +0x87, 0x0d, 0xaf, 0x50, 0x0e, 0x6d, 0xd0, 0x0e, 0x7a, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30, +0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x73, 0x20, 0x07, +0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, +0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, +0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x10, 0x07, 0x76, 0xa0, 0x07, +0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, +0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, +0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x43, 0x9e, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x3c, 0x06, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0c, 0x79, 0x10, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x18, 0xf2, 0x34, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe4, +0x79, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xc8, 0x23, 0x01, 0x01, +0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x90, 0xa7, 0x02, 0x02, 0x60, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2c, 0x10, 0x10, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14, +0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x22, 0x4a, 0x60, 0x04, 0xa0, +0x20, 0x8a, 0xa1, 0x08, 0x4a, 0xa2, 0x50, 0xca, 0xa0, 0x3c, 0xa8, 0x28, 0x89, 0x32, 0x28, 0x84, +0x11, 0x80, 0x22, 0x28, 0x10, 0xda, 0x66, 0x00, 0xa8, 0x9b, 0x01, 0xa0, 0x6f, 0x06, 0x80, 0xc0, +0xb1, 0x10, 0x83, 0x00, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, +0x63, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0xc4, 0x8e, 0x0c, 0x6f, 0xec, +0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45, 0x86, 0x06, 0xe6, 0xc6, 0xe5, 0x06, 0x04, 0x85, +0x26, 0xc6, 0xc6, 0x2c, 0x4c, 0xcc, 0x46, 0xac, 0x26, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x88, 0x63, +0x82, 0x40, 0x20, 0x1b, 0x84, 0x81, 0x98, 0x20, 0x10, 0xc9, 0x06, 0x61, 0x30, 0x28, 0xc0, 0xcd, +0x4d, 0x10, 0x08, 0x65, 0xc3, 0x80, 0x24, 0xc4, 0x04, 0x61, 0xb3, 0x08, 0x4c, 0x10, 0x88, 0x65, +0x82, 0x40, 0x30, 0x1b, 0x04, 0xc2, 0xd9, 0x90, 0x10, 0x0b, 0x43, 0x10, 0x43, 0x43, 0x3c, 0x1b, +0x02, 0x68, 0x82, 0xd0, 0x5d, 0x13, 0x04, 0xa2, 0xd9, 0x80, 0x10, 0x12, 0x43, 0x10, 0xc3, 0x04, +0x6c, 0x08, 0xa8, 0x09, 0xc2, 0x87, 0x6d, 0x40, 0x08, 0x8b, 0x21, 0x88, 0x81, 0x00, 0x36, 0x04, +0xd7, 0x06, 0x22, 0x02, 0x2a, 0x6c, 0x82, 0x00, 0x06, 0xd9, 0x86, 0x40, 0x9b, 0x20, 0x08, 0x00, +0x0d, 0xa8, 0xa9, 0xa6, 0xb0, 0x34, 0x37, 0x2e, 0x53, 0x56, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, +0x69, 0x6f, 0x6e, 0x13, 0x84, 0x02, 0x9a, 0x20, 0x14, 0xd1, 0x86, 0x80, 0x98, 0x20, 0x14, 0xd2, +0x04, 0xa1, 0x98, 0x36, 0x2c, 0x84, 0xf7, 0x81, 0x41, 0x18, 0x88, 0xc1, 0x20, 0x06, 0xc4, 0x18, +0x00, 0x44, 0xa8, 0x8a, 0xb0, 0x86, 0x9e, 0x9e, 0xa4, 0x88, 0x26, 0x08, 0x05, 0x35, 0x41, 0x20, +0x9c, 0x0d, 0xc2, 0x19, 0x9c, 0xc1, 0x86, 0x65, 0x28, 0x83, 0x6f, 0x0c, 0xc2, 0xc0, 0x0c, 0x06, +0x33, 0x18, 0xc6, 0x00, 0x0d, 0x36, 0x08, 0x64, 0x90, 0x06, 0x4c, 0xa6, 0xac, 0xbe, 0xa8, 0xc2, +0xe4, 0xce, 0xca, 0xe8, 0x26, 0x08, 0x45, 0x35, 0x41, 0x20, 0x9e, 0x0d, 0xc2, 0x19, 0xb4, 0xc1, +0x86, 0x85, 0x58, 0x83, 0x8f, 0x0d, 0xc2, 0x60, 0x0c, 0x06, 0x31, 0x20, 0xc6, 0xc0, 0x0d, 0x36, +0x04, 0x6f, 0xb0, 0x61, 0x50, 0x03, 0x38, 0x00, 0x36, 0x14, 0x5c, 0x17, 0x07, 0x19, 0x50, 0x85, +0x8d, 0xcd, 0xae, 0xcd, 0x25, 0x8d, 0xac, 0xcc, 0x8d, 0x6e, 0x4a, 0x10, 0x54, 0x21, 0xc3, 0x73, +0xb1, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x9b, 0x12, 0x10, 0x4d, 0xc8, 0xf0, 0x5c, 0xec, 0xc2, +0xd8, 0xec, 0xca, 0xe4, 0xa6, 0x04, 0x46, 0x1d, 0x32, 0x3c, 0x97, 0x39, 0xb4, 0x30, 0xb2, 0x32, +0xb9, 0xa6, 0x37, 0xb2, 0x32, 0xb6, 0x29, 0x41, 0x52, 0x86, 0x0c, 0xcf, 0x45, 0xae, 0x6c, 0xee, +0xad, 0x4e, 0x6e, 0xac, 0x6c, 0x6e, 0x4a, 0x80, 0xd5, 0x21, 0xc3, 0x73, 0xb1, 0x4b, 0x2b, 0xbb, +0x4b, 0x22, 0x9b, 0xa2, 0x0b, 0xa3, 0x2b, 0x9b, 0x12, 0x68, 0x75, 0xc8, 0xf0, 0x5c, 0xca, 0xdc, +0xe8, 0xe4, 0xf2, 0xa0, 0xde, 0xd2, 0xdc, 0xe8, 0xe6, 0xa6, 0x04, 0x71, 0x00, 0x00, 0x00, 0x00, +0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, +0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, +0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, +0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, +0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, +0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, +0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, +0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, +0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, +0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, +0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, +0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, +0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, +0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, +0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, +0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, +0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, 0xc4, +0x21, 0x07, 0x7c, 0x70, 0x03, 0x7a, 0x28, 0x87, 0x76, 0x80, 0x87, 0x19, 0xd1, 0x43, 0x0e, 0xf8, +0xe0, 0x06, 0xe4, 0x20, 0x0e, 0xe7, 0xe0, 0x06, 0xf6, 0x10, 0x0e, 0xf2, 0xc0, 0x0e, 0xe1, 0x90, +0x0f, 0xef, 0x50, 0x0f, 0xf4, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, +0x06, 0x60, 0xa4, 0xac, 0x09, 0x20, 0x8d, 0x15, 0x6c, 0xc3, 0xe5, 0x3b, 0x8f, 0x2f, 0x04, 0x54, +0x51, 0x10, 0x51, 0xe9, 0x00, 0x43, 0x49, 0x18, 0x80, 0x80, 0xf9, 0xc5, 0x6d, 0x9b, 0x81, 0x34, +0x5c, 0xbe, 0xf3, 0xf8, 0x42, 0x44, 0x00, 0x13, 0x11, 0x02, 0xcd, 0xb0, 0x10, 0x16, 0x30, 0x0d, +0x97, 0xef, 0x3c, 0xfe, 0xe2, 0x00, 0x83, 0xd8, 0x3c, 0xd4, 0xe4, 0x17, 0xb7, 0x6d, 0x03, 0xd0, +0x70, 0xf9, 0xce, 0xe3, 0x4b, 0x00, 0xf3, 0x2c, 0x84, 0x5f, 0xdc, 0xb6, 0x09, 0x54, 0xc3, 0xe5, +0x3b, 0x8f, 0x2f, 0x4d, 0x4e, 0x44, 0xa0, 0xd4, 0xf4, 0x50, 0x93, 0x5f, 0xdc, 0xb6, 0x11, 0x3c, +0xc3, 0xe5, 0x3b, 0x8f, 0x4f, 0x35, 0x40, 0x84, 0xf9, 0xc5, 0x6d, 0x03, 0x61, 0x20, 0x00, 0x00, +0x51, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, +0x44, 0x8d, 0x00, 0x50, 0x51, 0x02, 0x44, 0x94, 0x4a, 0x69, 0x94, 0x42, 0xc9, 0xcd, 0x00, 0x14, +0x42, 0xd9, 0x15, 0x1e, 0x0d, 0x63, 0x04, 0x7b, 0xac, 0xc6, 0x23, 0x38, 0x8c, 0x11, 0xcc, 0x39, +0x6b, 0xce, 0xdf, 0x18, 0x01, 0x08, 0x82, 0x20, 0xfc, 0xcd, 0x00, 0x00, 0x23, 0x06, 0x09, 0x00, +0x82, 0x60, 0x50, 0x89, 0x41, 0x52, 0x81, 0x01, 0x18, 0x38, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, +0x50, 0x8d, 0x81, 0x82, 0x85, 0x41, 0x18, 0x3c, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x50, 0x91, +0xc1, 0x62, 0x89, 0x81, 0x18, 0x40, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0xa8, 0x81, 0x42, +0x06, 0x63, 0x80, 0x2d, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0xac, 0xc1, 0x52, 0x06, 0x64, +0x10, 0x31, 0x23, 0x06, 0x0f, 0x00, 0x82, 0x60, 0xd0, 0xa8, 0x81, 0x52, 0x10, 0x42, 0x60, 0x18, +0x65, 0x50, 0x06, 0x8d, 0x31, 0x9a, 0x10, 0x00, 0xa3, 0x09, 0x42, 0x30, 0x9a, 0x30, 0x08, 0xa3, +0x09, 0xc4, 0x30, 0x62, 0x70, 0x00, 0x20, 0x08, 0x06, 0x52, 0x1b, 0x40, 0x88, 0x1a, 0x8c, 0x26, +0x04, 0x81, 0x21, 0x8f, 0x7c, 0x2c, 0x10, 0xe4, 0x33, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x8f, +0x1c, 0x64, 0x81, 0x05, 0x91, 0x7c, 0x2c, 0x90, 0xe0, 0x63, 0xc1, 0x22, 0x1f, 0x13, 0x16, 0xf9, +0xd8, 0xb0, 0xc8, 0x67, 0xc4, 0xe0, 0x00, 0x40, 0x10, 0x0c, 0xa4, 0x3b, 0xd0, 0xa4, 0x3a, 0x18, +0x4d, 0x08, 0x00, 0x0b, 0x34, 0xf9, 0x8c, 0x18, 0x18, 0x00, 0x08, 0x82, 0xc1, 0xb3, 0x07, 0x63, +0x10, 0xd8, 0x11, 0xc8, 0xc7, 0x0e, 0x41, 0x3e, 0x76, 0x0c, 0xf2, 0x31, 0x65, 0x88, 0x8f, 0x29, +0x43, 0x7c, 0x4c, 0x19, 0xe2, 0x33, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x08, 0x29, 0xa0, 0x81, +0x1f, 0xf8, 0xc1, 0x1c, 0x0c, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x80, 0x90, 0x02, 0x1a, 0xf8, +0x81, 0x1f, 0xac, 0x81, 0x30, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x08, 0x29, 0xa0, 0x81, 0x1f, +0xf8, 0x81, 0x1c, 0x04, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x80, 0x90, 0x02, 0x1a, 0xf8, 0x81, +0x1f, 0xd4, 0x41, 0x85, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/Common/Dx11-Shader/TV_shader.h b/Common/Dx11-Shader/TV_shader.h new file mode 100644 index 00000000..51395e7a --- /dev/null +++ b/Common/Dx11-Shader/TV_shader.h @@ -0,0 +1,16 @@ +// TV_shader.h +#pragma once +#include + +extern const int TVShader_VS_size; +extern const BYTE TVShader_VS[]; + +extern const int TVShader_PS_size; +extern const BYTE TVShader_PS[]; + +struct PerFrameBuffer +{ + DirectX::XMFLOAT4 resolution; + float time; + float padding[3]; // Align to 16 bytes +}; \ No newline at end of file diff --git a/Common/Include/crt_shader.h b/Common/Include/crt_shader.h new file mode 100644 index 00000000..c0977752 --- /dev/null +++ b/Common/Include/crt_shader.h @@ -0,0 +1,477 @@ +// crt_shader.h +#include +#pragma once + +const int CRTShader_VS_size = 3100; +const BYTE CRTShader_VS[3100] = {0x44, 0x58, 0x42, 0x43, 0xc4, 0xc2, 0xf2, 0x52, 0x48, 0xf3, 0xa1, 0x52, 0x1d, 0x82, 0x8d, 0xd7, +0xa1, 0xfc, 0xdf, 0xe6, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x0c, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, +0x3c, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00, +0xf0, 0x01, 0x00, 0x00, 0xc8, 0x06, 0x00, 0x00, 0xe4, 0x06, 0x00, 0x00, 0x53, 0x46, 0x49, 0x30, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x53, 0x47, 0x31, +0x5c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x4f, 0x53, 0x49, +0x54, 0x49, 0x4f, 0x4e, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x00, 0x00, +0x4f, 0x53, 0x47, 0x31, 0x60, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x53, 0x56, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x54, 0x45, 0x58, 0x43, +0x4f, 0x4f, 0x52, 0x44, 0x00, 0x00, 0x00, 0x00, 0x50, 0x53, 0x56, 0x30, 0xd0, 0x00, 0x00, 0x00, +0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, +0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, +0x00, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, +0x52, 0x44, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x56, 0x53, 0x4d, 0x61, +0x69, 0x6e, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0x00, 0x03, 0x00, 0x00, 0x00, +0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x42, 0x00, 0x03, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0x03, 0x03, 0x04, 0x00, 0x00, +0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x42, 0x00, 0x03, 0x02, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x53, 0x54, 0x41, 0x54, 0xd0, 0x04, 0x00, 0x00, 0x60, 0x00, 0x01, 0x00, 0x34, 0x01, 0x00, 0x00, +0x44, 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xb8, 0x04, 0x00, 0x00, +0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0x2b, 0x01, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, +0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, +0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, +0x80, 0x10, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0x84, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x4b, +0x0a, 0x32, 0x42, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, +0xe4, 0x48, 0x0e, 0x90, 0x11, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a, +0x04, 0x21, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1b, 0x8c, 0xe0, 0xff, +0xff, 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8, 0x0d, 0x84, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x03, 0x20, +0x01, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x82, 0x60, 0x42, +0x20, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x32, 0x22, 0x08, 0x09, +0x20, 0x64, 0x85, 0x04, 0x13, 0x22, 0xa4, 0x84, 0x04, 0x13, 0x22, 0xe3, 0x84, 0xa1, 0x90, 0x14, +0x12, 0x4c, 0x88, 0x8c, 0x0b, 0x84, 0x84, 0x4c, 0x10, 0x30, 0x23, 0x00, 0x25, 0x00, 0x8a, 0x19, +0x80, 0x39, 0x02, 0x30, 0x98, 0x23, 0x40, 0x8a, 0x31, 0x44, 0x54, 0x44, 0x56, 0x0c, 0x20, 0xa2, +0x1a, 0xc2, 0x81, 0x80, 0x44, 0x20, 0x00, 0x00, 0x13, 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60, 0x87, +0x36, 0x68, 0x87, 0x79, 0x68, 0x03, 0x72, 0xc0, 0x87, 0x0d, 0xaf, 0x50, 0x0e, 0x6d, 0xd0, 0x0e, +0x7a, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, +0x90, 0x0e, 0x71, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x73, 0x20, +0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x30, 0x07, +0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, +0xd0, 0x06, 0xe6, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, +0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, +0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x76, +0x40, 0x07, 0x43, 0x9e, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, +0x3c, 0x06, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x79, 0x10, 0x20, +0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x02, 0x01, 0x0c, 0x00, 0x00, 0x00, +0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0xa2, +0x12, 0x18, 0x01, 0x28, 0x86, 0x32, 0x28, 0x8f, 0xd2, 0xa0, 0x2a, 0x89, 0x11, 0x80, 0x42, 0x28, +0x82, 0x32, 0xa0, 0x1d, 0x0b, 0x31, 0x8c, 0x40, 0x20, 0x10, 0x08, 0x0c, 0x00, 0x00, 0x00, 0x00, +0x79, 0x18, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0xc4, +0x8e, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45, 0x86, 0x06, 0xe6, 0xc6, +0xe5, 0x06, 0x04, 0x85, 0x26, 0xc6, 0xc6, 0x2c, 0x4c, 0xcc, 0x46, 0xac, 0x26, 0x65, 0x43, 0x10, +0x4c, 0x10, 0x88, 0x61, 0x82, 0x40, 0x10, 0x1b, 0x84, 0x81, 0xd8, 0x20, 0x10, 0x04, 0x05, 0xbb, +0xb9, 0x09, 0x02, 0x51, 0x6c, 0x18, 0x0e, 0x84, 0x98, 0x20, 0x08, 0xc0, 0x06, 0x60, 0xc3, 0x40, +0x2c, 0xcb, 0x86, 0x80, 0xd9, 0x30, 0x0c, 0x4a, 0x33, 0x41, 0x58, 0x9c, 0x0d, 0xc1, 0x43, 0xc3, +0x6a, 0xaa, 0x29, 0x2c, 0xcd, 0x8d, 0x08, 0xd4, 0xd3, 0x54, 0x12, 0x55, 0xd2, 0x93, 0xd3, 0x04, +0xa1, 0x48, 0x26, 0x08, 0x85, 0xb2, 0x21, 0x20, 0x26, 0x08, 0xc5, 0x32, 0x41, 0x20, 0x8c, 0x09, +0x02, 0x71, 0x6c, 0x10, 0x2e, 0x6c, 0xc3, 0x42, 0x48, 0x13, 0x55, 0x51, 0x83, 0x45, 0x50, 0x19, +0x11, 0xaa, 0x22, 0xac, 0xa1, 0xa7, 0x27, 0x29, 0xa2, 0x09, 0x42, 0xc1, 0x6c, 0x10, 0xae, 0x6b, +0xc3, 0x32, 0x6c, 0x13, 0x55, 0x51, 0x03, 0x37, 0x50, 0xdd, 0x06, 0x41, 0xf3, 0xb8, 0x4c, 0x59, +0x7d, 0x41, 0xbd, 0xcd, 0xa5, 0xd1, 0xa5, 0xbd, 0xb9, 0x4d, 0x10, 0x8a, 0x66, 0xc3, 0x42, 0x80, +0xc1, 0x14, 0x06, 0x95, 0x35, 0x58, 0x04, 0x95, 0x6d, 0x58, 0x86, 0x6d, 0xa2, 0x2a, 0x6e, 0xe0, +0x06, 0xaa, 0xdb, 0x20, 0x88, 0xc1, 0x18, 0x6c, 0x18, 0x3e, 0x32, 0x00, 0x36, 0x14, 0x4a, 0x54, +0x06, 0x00, 0xc0, 0x22, 0xcd, 0x6d, 0x8e, 0x6e, 0x6e, 0x82, 0x40, 0x20, 0x34, 0xe6, 0xd2, 0xce, +0xbe, 0xd8, 0xc8, 0x68, 0xcc, 0xa5, 0x9d, 0x7d, 0xcd, 0xd1, 0x6d, 0x30, 0xce, 0x00, 0x0d, 0xd2, +0x00, 0x51, 0x03, 0xa4, 0x0a, 0x1b, 0x9b, 0x5d, 0x9b, 0x4b, 0x1a, 0x59, 0x99, 0x1b, 0xdd, 0x94, +0x20, 0xa8, 0x42, 0x86, 0xe7, 0x62, 0x57, 0x26, 0x37, 0x97, 0xf6, 0xe6, 0x36, 0x25, 0x20, 0x9a, +0x90, 0xe1, 0xb9, 0xd8, 0x85, 0xb1, 0xd9, 0x95, 0xc9, 0x4d, 0x09, 0x8a, 0x3a, 0x64, 0x78, 0x2e, +0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x02, 0xa4, 0x12, 0x19, +0x9e, 0x0b, 0x5d, 0x1e, 0x5c, 0x59, 0x90, 0x9b, 0xdb, 0x1b, 0x5d, 0x18, 0x5d, 0xda, 0x9b, 0xdb, +0xdc, 0x94, 0xa0, 0xa9, 0x43, 0x86, 0xe7, 0x62, 0x97, 0x56, 0x76, 0x97, 0x44, 0x36, 0x45, 0x17, +0x46, 0x57, 0x36, 0x25, 0x78, 0xea, 0x90, 0xe1, 0xb9, 0x94, 0xb9, 0xd1, 0xc9, 0xe5, 0x41, 0xbd, +0xa5, 0xb9, 0xd1, 0xcd, 0x4d, 0x09, 0xca, 0xa0, 0x0b, 0x19, 0x9e, 0xcb, 0xd8, 0x5b, 0x9d, 0x1b, +0x5d, 0x99, 0xdc, 0xdc, 0x94, 0x40, 0x0d, 0x00, 0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, +0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, +0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, +0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, +0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, +0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, +0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, +0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, +0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, +0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, +0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, +0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, +0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, +0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, +0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, +0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, +0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, +0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70, 0x03, 0x72, 0x10, 0x87, +0x73, 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60, 0x87, 0x70, 0xc8, 0x87, 0x77, 0xa8, 0x07, 0x7a, +0x98, 0x81, 0x3c, 0xe4, 0x80, 0x0f, 0x6e, 0x40, 0x0f, 0xe5, 0xd0, 0x0e, 0xf0, 0x00, 0x00, 0x00, +0x71, 0x20, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x06, 0x60, 0xbc, 0xac, 0x09, 0x20, 0x8d, 0x05, +0x4c, 0xc3, 0xe5, 0x3b, 0x8f, 0xbf, 0x38, 0xc0, 0x20, 0x36, 0x0f, 0x35, 0xf9, 0xc5, 0x6d, 0x9b, +0x40, 0x35, 0x5c, 0xbe, 0xf3, 0xf8, 0xd2, 0xe4, 0x44, 0x04, 0x4a, 0x4d, 0x0f, 0x35, 0xf9, 0xc5, +0x6d, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x14, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xbb, 0xc1, 0x02, 0x5d, 0x6d, 0x5c, 0x1a, 0xd9, 0x80, 0x51, 0xe1, 0xc6, +0x68, 0x94, 0x65, 0x78, 0x44, 0x58, 0x49, 0x4c, 0x30, 0x05, 0x00, 0x00, 0x60, 0x00, 0x01, 0x00, +0x4c, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x18, 0x05, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0x43, 0x01, 0x00, 0x00, +0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, +0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, +0x1e, 0x04, 0x8b, 0x62, 0x80, 0x10, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0x84, 0x10, 0x32, 0x14, +0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x42, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5, +0x00, 0x19, 0x32, 0x42, 0xe4, 0x48, 0x0e, 0x90, 0x11, 0x22, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, +0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x21, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, +0x1b, 0x8c, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8, 0x0d, 0x84, 0xf0, 0xff, 0xff, +0xff, 0xff, 0x03, 0x20, 0x01, 0x00, 0x00, 0x00, 0x49, 0x18, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x13, 0x82, 0x60, 0x42, 0x20, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, +0x32, 0x22, 0x08, 0x09, 0x20, 0x64, 0x85, 0x04, 0x13, 0x22, 0xa4, 0x84, 0x04, 0x13, 0x22, 0xe3, +0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x88, 0x8c, 0x0b, 0x84, 0x84, 0x4c, 0x10, 0x30, 0x23, 0x00, +0x25, 0x00, 0x8a, 0x19, 0x80, 0x39, 0x02, 0x30, 0x98, 0x23, 0x40, 0x8a, 0x31, 0x44, 0x54, 0x44, +0x56, 0x0c, 0x20, 0xa2, 0x1a, 0xc2, 0x81, 0x80, 0x44, 0x20, 0x00, 0x00, 0x13, 0x14, 0x72, 0xc0, +0x87, 0x74, 0x60, 0x87, 0x36, 0x68, 0x87, 0x79, 0x68, 0x03, 0x72, 0xc0, 0x87, 0x0d, 0xaf, 0x50, +0x0e, 0x6d, 0xd0, 0x0e, 0x7a, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, +0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x78, +0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, +0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, +0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, +0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, +0x07, 0x76, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, +0x72, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x43, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x86, 0x3c, 0x06, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0c, 0x79, 0x10, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x02, 0x01, +0x0c, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x10, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, +0xc6, 0x04, 0x43, 0xa2, 0x12, 0x18, 0x01, 0x28, 0x88, 0x62, 0x28, 0x83, 0xf2, 0xa0, 0x2a, 0x89, +0x11, 0x80, 0x42, 0x28, 0x82, 0x32, 0xa0, 0x1d, 0x0b, 0x31, 0x8c, 0x40, 0x20, 0x10, 0x08, 0x0c, +0x00, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, +0x46, 0x02, 0x13, 0xc4, 0x8e, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45, +0x86, 0x06, 0xe6, 0xc6, 0xe5, 0x06, 0x04, 0x85, 0x26, 0xc6, 0xc6, 0x2c, 0x4c, 0xcc, 0x46, 0xac, +0x26, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x88, 0x61, 0x82, 0x40, 0x10, 0x1b, 0x84, 0x81, 0x98, 0x20, +0x10, 0xc5, 0x06, 0x61, 0x30, 0x28, 0xd8, 0xcd, 0x4d, 0x10, 0x08, 0x63, 0xc3, 0x80, 0x24, 0xc4, +0x04, 0x61, 0x71, 0x36, 0x04, 0xcb, 0x04, 0x41, 0x00, 0x68, 0x58, 0x4d, 0x35, 0x85, 0xa5, 0xb9, +0x11, 0x81, 0x7a, 0x9a, 0x4a, 0xa2, 0x4a, 0x7a, 0x72, 0x9a, 0x20, 0x14, 0xc9, 0x04, 0xa1, 0x50, +0x36, 0x04, 0xc4, 0x04, 0xa1, 0x58, 0x26, 0x08, 0xc4, 0x31, 0x41, 0x20, 0x90, 0x0d, 0x02, 0x55, +0x6d, 0x58, 0x88, 0x07, 0x8a, 0xa4, 0x68, 0x98, 0x88, 0xc8, 0x22, 0x42, 0x55, 0x84, 0x35, 0xf4, +0xf4, 0x24, 0x45, 0x34, 0x41, 0x28, 0x98, 0x0d, 0x02, 0x45, 0x6d, 0x58, 0x06, 0x0c, 0x8a, 0xa4, +0x68, 0xc8, 0x86, 0x48, 0xdb, 0x20, 0x5c, 0x1b, 0x97, 0x29, 0xab, 0x2f, 0xa8, 0xb7, 0xb9, 0x34, +0xba, 0xb4, 0x37, 0xb7, 0x09, 0x42, 0xd1, 0x6c, 0x58, 0x88, 0x0e, 0xf2, 0xa4, 0x69, 0x98, 0x88, +0xc8, 0xda, 0xb0, 0x0c, 0x18, 0x14, 0x49, 0xd9, 0x90, 0x0d, 0x91, 0xb6, 0x41, 0xf8, 0xc0, 0x60, +0xc3, 0xc0, 0x85, 0x01, 0xb0, 0xa1, 0x68, 0x1c, 0x31, 0x00, 0x80, 0x2a, 0x6c, 0x6c, 0x76, 0x6d, +0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x53, 0x82, 0xa0, 0x0a, 0x19, 0x9e, 0x8b, 0x5d, 0x99, 0xdc, +0x5c, 0xda, 0x9b, 0xdb, 0x94, 0x80, 0x68, 0x42, 0x86, 0xe7, 0x62, 0x17, 0xc6, 0x66, 0x57, 0x26, +0x37, 0x25, 0x30, 0xea, 0x90, 0xe1, 0xb9, 0xcc, 0xa1, 0x85, 0x91, 0x95, 0xc9, 0x35, 0xbd, 0x91, +0x95, 0xb1, 0x4d, 0x09, 0x92, 0x3a, 0x64, 0x78, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x49, 0x64, 0x53, +0x74, 0x61, 0x74, 0x65, 0x53, 0x82, 0xa5, 0x0e, 0x19, 0x9e, 0x4b, 0x99, 0x1b, 0x9d, 0x5c, 0x1e, +0xd4, 0x5b, 0x9a, 0x1b, 0xdd, 0xdc, 0x94, 0x40, 0x0c, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, +0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, +0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, +0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, +0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, +0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, +0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, +0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, +0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, +0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, +0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, +0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, +0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, +0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, +0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, +0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, +0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, +0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70, +0x03, 0x72, 0x10, 0x87, 0x73, 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60, 0x87, 0x70, 0xc8, 0x87, +0x77, 0xa8, 0x07, 0x7a, 0x98, 0x81, 0x3c, 0xe4, 0x80, 0x0f, 0x6e, 0x40, 0x0f, 0xe5, 0xd0, 0x0e, +0xf0, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x06, 0x60, 0xbc, 0xac, +0x09, 0x20, 0x8d, 0x05, 0x4c, 0xc3, 0xe5, 0x3b, 0x8f, 0xbf, 0x38, 0xc0, 0x20, 0x36, 0x0f, 0x35, +0xf9, 0xc5, 0x6d, 0x9b, 0x40, 0x35, 0x5c, 0xbe, 0xf3, 0xf8, 0xd2, 0xe4, 0x44, 0x04, 0x4a, 0x4d, +0x0f, 0x35, 0xf9, 0xc5, 0x6d, 0x03, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, +0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x44, 0x85, 0x30, 0x03, +0x50, 0x0a, 0x54, 0x25, 0x00, 0x00, 0x00, 0x00, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0x48, +0x04, 0xf4, 0x24, 0xc3, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x18, 0x53, 0x11, 0x41, 0x02, 0x31, +0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x06, 0x65, 0x44, 0xd1, 0x52, 0x8c, 0x18, 0x24, 0x00, 0x08, +0x82, 0x81, 0x51, 0x1d, 0x92, 0x44, 0x18, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0x58, 0xc8, +0x34, 0x2d, 0xc7, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x18, 0x57, 0x42, 0x51, 0x0b, 0x32, 0x62, +0x90, 0x00, 0x20, 0x08, 0x06, 0xc8, 0x85, 0x54, 0xd5, 0x43, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, +0x01, 0x72, 0x21, 0x55, 0x75, 0x0c, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x80, 0x5c, 0x48, 0x55, +0x35, 0xc2, 0x88, 0x41, 0x02, 0x80, 0x20, 0x18, 0x20, 0x17, 0x52, 0x55, 0x4c, 0x30, 0x62, 0x90, +0x00, 0x20, 0x08, 0x06, 0xc8, 0x85, 0x58, 0xd5, 0x63, 0x8c, 0x18, 0x24, 0x00, 0x08, 0x82, 0x01, +0x72, 0x21, 0x56, 0x75, 0x14, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +const int CRTShader_PS_size = 4412; +const BYTE CRTShader_PS[4412] = {0x44, 0x58, 0x42, 0x43, 0x3f, 0x2b, 0xee, 0x8e, 0x04, 0x44, 0xe1, 0xcb, 0xc2, 0x11, 0xfd, 0x4d, +0x32, 0x0b, 0x9e, 0x89, 0x01, 0x00, 0x00, 0x00, 0x3c, 0x11, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, +0x3c, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, +0xf4, 0x01, 0x00, 0x00, 0x58, 0x09, 0x00, 0x00, 0x74, 0x09, 0x00, 0x00, 0x53, 0x46, 0x49, 0x30, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x53, 0x47, 0x31, +0x60, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x56, 0x5f, 0x50, +0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, +0x00, 0x00, 0x00, 0x00, 0x4f, 0x53, 0x47, 0x31, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x00, 0x00, 0x00, +0x50, 0x53, 0x56, 0x30, 0xfc, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, +0x03, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x14, 0x00, 0x00, 0x00, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x50, 0x53, +0x4d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0x03, +0x03, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x42, 0x00, +0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0x10, +0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x53, 0x54, 0x41, 0x54, 0x5c, 0x07, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, +0xd7, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x44, 0x07, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0xce, 0x01, 0x00, 0x00, +0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, +0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, +0x1e, 0x04, 0x8b, 0x62, 0x80, 0x18, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32, 0x14, +0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x62, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5, +0x00, 0x19, 0x32, 0x42, 0xe4, 0x48, 0x0e, 0x90, 0x11, 0x23, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, +0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x31, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x1b, 0x8c, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8, 0x0d, 0x84, 0xf0, 0xff, 0xff, +0xff, 0xff, 0x03, 0x20, 0x6d, 0x30, 0x86, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x09, 0xa8, 0x00, +0x49, 0x18, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x13, 0x82, 0x60, 0x42, 0x20, 0x4c, 0x08, 0x06, +0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88, 0x09, +0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, 0x14, +0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0x84, 0xc1, 0x08, 0x40, 0x09, 0x00, 0x0a, +0x66, 0x00, 0xe6, 0x08, 0xc0, 0x60, 0x8e, 0x00, 0x29, 0xc6, 0x40, 0x10, 0x44, 0x41, 0x90, 0x51, +0x0c, 0x80, 0x20, 0x88, 0x62, 0x20, 0xe4, 0xa6, 0xe1, 0xf2, 0x27, 0xec, 0x21, 0x24, 0x7f, 0x25, +0xa4, 0x95, 0x98, 0xfc, 0xe2, 0xb6, 0x51, 0x31, 0x0c, 0xc3, 0x40, 0x50, 0x71, 0xcf, 0x70, 0xf9, +0x13, 0xf6, 0x10, 0x92, 0x1f, 0x02, 0xcd, 0xb0, 0x10, 0x28, 0x58, 0x0a, 0xa3, 0x10, 0x0c, 0x33, +0x0c, 0xc3, 0x40, 0x10, 0xc4, 0x40, 0x4d, 0x19, 0x06, 0x62, 0xa0, 0xe7, 0xa8, 0xe1, 0xf2, 0x27, +0xec, 0x21, 0x24, 0x9f, 0xdb, 0xa8, 0x62, 0x25, 0x26, 0xbf, 0xb8, 0x6d, 0x44, 0x0c, 0xc3, 0x30, +0x14, 0x22, 0x22, 0x18, 0x82, 0xa4, 0x39, 0x82, 0xa0, 0x18, 0x0c, 0x51, 0x10, 0x04, 0x45, 0xd5, +0x40, 0xc0, 0x30, 0x02, 0x31, 0xcc, 0xd4, 0x06, 0xe3, 0xc0, 0x0e, 0xe1, 0x30, 0x0f, 0xf3, 0xe0, +0x06, 0xb4, 0x50, 0x0e, 0xf8, 0x40, 0x0f, 0xf5, 0x20, 0x0f, 0xe5, 0x20, 0x07, 0xa4, 0xc0, 0x07, +0xf6, 0x50, 0x0e, 0xe3, 0x40, 0x0f, 0xef, 0x20, 0x0f, 0x7c, 0x60, 0x0e, 0xec, 0xf0, 0x0e, 0xe1, +0x40, 0x0f, 0x6c, 0x00, 0x06, 0x74, 0xe0, 0x07, 0x60, 0xe0, 0x07, 0x7a, 0xa0, 0x07, 0xed, 0x90, +0x0e, 0xf0, 0x30, 0x0f, 0xbf, 0x40, 0x0f, 0xf9, 0x00, 0x0f, 0xe5, 0x80, 0x02, 0x62, 0x26, 0x31, +0x18, 0x07, 0x76, 0x08, 0x87, 0x79, 0x98, 0x07, 0x37, 0xa0, 0x85, 0x72, 0xc0, 0x07, 0x7a, 0xa8, +0x07, 0x79, 0x28, 0x07, 0x39, 0x20, 0x05, 0x3e, 0xb0, 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07, +0x79, 0xe0, 0x03, 0x73, 0x60, 0x87, 0x77, 0x08, 0x07, 0x7a, 0x60, 0x03, 0x30, 0xa0, 0x03, 0x3f, +0x00, 0x03, 0x3f, 0x40, 0x02, 0x96, 0x91, 0x76, 0x4e, 0x4a, 0x44, 0x5f, 0x04, 0x30, 0xc4, 0x46, +0x15, 0x05, 0x11, 0x21, 0x01, 0x1b, 0x88, 0xbb, 0x49, 0x9a, 0x22, 0x4a, 0x98, 0x7c, 0x16, 0x60, +0x9e, 0x85, 0x88, 0xd8, 0x09, 0x98, 0x08, 0x14, 0x10, 0xe4, 0x25, 0x02, 0x01, 0x00, 0x00, 0x00, +0x13, 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60, 0x87, 0x36, 0x68, 0x87, 0x79, 0x68, 0x03, 0x72, 0xc0, +0x87, 0x0d, 0xaf, 0x50, 0x0e, 0x6d, 0xd0, 0x0e, 0x7a, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30, +0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x73, 0x20, 0x07, +0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, +0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, +0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x10, 0x07, 0x76, 0xa0, 0x07, +0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, +0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, +0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x43, 0x9e, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x3c, 0x06, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0c, 0x79, 0x10, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x18, 0xf2, 0x34, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe4, +0x79, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xc8, 0x23, 0x01, 0x01, +0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x90, 0xa7, 0x02, 0x02, 0x60, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2c, 0x10, 0x13, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x18, +0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x22, 0x4a, 0x60, 0x04, 0xa0, +0x18, 0x8a, 0xa0, 0x24, 0x0a, 0xa5, 0x0c, 0xca, 0xa1, 0x34, 0x0a, 0xa1, 0x40, 0xca, 0xa3, 0x8c, +0xa8, 0x28, 0x89, 0x32, 0x28, 0x84, 0x11, 0x80, 0x22, 0x28, 0x10, 0xa2, 0x6a, 0x80, 0xb6, 0x19, +0x00, 0xe2, 0x66, 0x00, 0xa8, 0x9b, 0x01, 0xa0, 0x6f, 0x06, 0x80, 0xc0, 0xb1, 0x10, 0x83, 0x00, +0x00, 0x00, 0x78, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, +0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0xc4, 0x8e, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x24, +0xc6, 0x05, 0xc7, 0x45, 0x86, 0x06, 0xe6, 0xc6, 0xe5, 0x06, 0x04, 0x85, 0x26, 0xc6, 0xc6, 0x2c, +0x4c, 0xcc, 0x46, 0xac, 0x26, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x88, 0x63, 0x82, 0x40, 0x20, 0x1b, +0x84, 0x81, 0xd8, 0x20, 0x10, 0x04, 0x05, 0xb8, 0xb9, 0x09, 0x02, 0x91, 0x6c, 0x18, 0x0e, 0x84, +0x98, 0x20, 0x6c, 0x1b, 0x9d, 0xb3, 0xaf, 0x24, 0x37, 0xb8, 0x3a, 0x3a, 0xaa, 0x32, 0x3c, 0xba, +0x3a, 0xb9, 0xb2, 0x09, 0x02, 0xa1, 0x4c, 0x10, 0x88, 0x65, 0x83, 0x40, 0x34, 0x1b, 0x12, 0x42, +0x59, 0x08, 0x62, 0x60, 0x08, 0x67, 0x43, 0xf0, 0x4c, 0x10, 0xba, 0x8e, 0x0e, 0x54, 0x99, 0x9c, +0x91, 0x5c, 0x58, 0x5b, 0x99, 0x50, 0x9d, 0x99, 0x59, 0x99, 0xdc, 0x04, 0x81, 0x60, 0x36, 0x20, +0x44, 0x24, 0x11, 0xc4, 0x30, 0x01, 0x1b, 0x02, 0x6a, 0x82, 0xf0, 0x79, 0x4c, 0xce, 0xbe, 0xa6, +0xc2, 0xda, 0xe0, 0xd8, 0xca, 0xe4, 0x36, 0x20, 0x84, 0x75, 0x11, 0xc4, 0x40, 0x00, 0x1b, 0x02, +0x6c, 0x03, 0x01, 0x01, 0x55, 0x36, 0x41, 0xe0, 0x38, 0x32, 0x75, 0x5f, 0x72, 0x65, 0x73, 0x6f, +0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x13, 0x04, 0xa2, 0x99, 0x20, 0x10, 0xce, 0x04, 0x81, 0xd2, +0x26, 0x08, 0xc4, 0x33, 0x41, 0x20, 0xa0, 0x0d, 0x0a, 0xc2, 0x75, 0x84, 0xd7, 0x34, 0x1f, 0x18, +0x84, 0x01, 0x8d, 0xba, 0x2f, 0xba, 0xb4, 0xb6, 0xb2, 0x09, 0x02, 0x11, 0x6d, 0x40, 0x90, 0x31, +0xe8, 0xc8, 0xc0, 0x6b, 0x9a, 0x6f, 0xc3, 0x30, 0x89, 0x41, 0x19, 0x6c, 0x18, 0x88, 0xcd, 0x0c, +0x26, 0x08, 0x02, 0xb0, 0x01, 0xd8, 0x30, 0x10, 0x69, 0x90, 0x06, 0x1b, 0x02, 0x35, 0xd8, 0x30, +0x0c, 0x68, 0xb0, 0x06, 0x13, 0x04, 0x30, 0xf8, 0x36, 0x04, 0x6d, 0x40, 0x03, 0x6a, 0xaa, 0x29, +0x2c, 0xcd, 0x8d, 0xcb, 0x94, 0xd5, 0x17, 0xd4, 0xdb, 0x5c, 0x1a, 0x5d, 0xda, 0x9b, 0xdb, 0x04, +0xa1, 0xa0, 0x26, 0x08, 0x45, 0xb5, 0x21, 0x20, 0x26, 0x08, 0x85, 0x35, 0x41, 0x28, 0xae, 0x0d, +0x0b, 0x01, 0x07, 0x71, 0x20, 0x07, 0x73, 0x40, 0x07, 0x03, 0x1d, 0x10, 0x75, 0x00, 0x10, 0xa1, +0x2a, 0xc2, 0x1a, 0x7a, 0x7a, 0x92, 0x22, 0x9a, 0x20, 0x14, 0xd8, 0x06, 0xa1, 0xeb, 0x36, 0x2c, +0xc3, 0x1d, 0xc4, 0x41, 0x1d, 0xcc, 0x01, 0x1e, 0x0c, 0x78, 0x30, 0xd4, 0x41, 0x1e, 0x6c, 0x10, +0xec, 0x40, 0x0f, 0x98, 0x4c, 0x59, 0x7d, 0x51, 0x85, 0xc9, 0x9d, 0x95, 0xd1, 0x4d, 0x10, 0x8a, +0x6c, 0x82, 0x40, 0x48, 0x1b, 0x84, 0xce, 0x0f, 0x36, 0x2c, 0x04, 0x1f, 0xc4, 0x41, 0x1f, 0xcc, +0x41, 0x1d, 0x0c, 0x74, 0x40, 0xd4, 0xc1, 0x1f, 0x6c, 0x08, 0x40, 0x61, 0xc3, 0xb0, 0x07, 0xa1, +0x00, 0x6c, 0x28, 0xd0, 0xe0, 0x0d, 0x44, 0x41, 0x03, 0x68, 0x98, 0xb1, 0xbd, 0x85, 0xd1, 0xcd, +0xb1, 0x48, 0x73, 0x9b, 0xa3, 0x9b, 0x9b, 0x20, 0x10, 0x13, 0x8d, 0xb9, 0xb4, 0xb3, 0x2f, 0x36, +0x32, 0x1a, 0x73, 0x69, 0x67, 0x5f, 0x73, 0x74, 0x44, 0xe8, 0xca, 0xf0, 0xbe, 0xdc, 0xde, 0xe4, +0xda, 0x36, 0x28, 0xa4, 0x40, 0x06, 0xa5, 0x60, 0x0a, 0xa7, 0xc0, 0xa0, 0x42, 0x18, 0xa4, 0xc2, +0x50, 0x85, 0x8d, 0xcd, 0xae, 0xcd, 0x25, 0x8d, 0xac, 0xcc, 0x8d, 0x6e, 0x4a, 0x10, 0x54, 0x21, +0xc3, 0x73, 0xb1, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x9b, 0x12, 0x10, 0x4d, 0xc8, 0xf0, 0x5c, +0xec, 0xc2, 0xd8, 0xec, 0xca, 0xe4, 0xa6, 0x04, 0x45, 0x1d, 0x32, 0x3c, 0x97, 0x39, 0xb4, 0x30, +0xb2, 0x32, 0xb9, 0xa6, 0x37, 0xb2, 0x32, 0xb6, 0x29, 0x01, 0x52, 0x86, 0x0c, 0xcf, 0x45, 0xae, +0x6c, 0xee, 0xad, 0x4e, 0x6e, 0xac, 0x6c, 0x6e, 0x4a, 0x90, 0x55, 0x22, 0xc3, 0x73, 0xa1, 0xcb, +0x83, 0x2b, 0x0b, 0x72, 0x73, 0x7b, 0xa3, 0x0b, 0xa3, 0x4b, 0x7b, 0x73, 0x9b, 0x9b, 0x22, 0x98, +0xc1, 0x1a, 0xd4, 0x21, 0xc3, 0x73, 0xb1, 0x4b, 0x2b, 0xbb, 0x4b, 0x22, 0x9b, 0xa2, 0x0b, 0xa3, +0x2b, 0x9b, 0x12, 0xb4, 0x41, 0x1d, 0x32, 0x3c, 0x97, 0x32, 0x37, 0x3a, 0xb9, 0x3c, 0xa8, 0xb7, +0x34, 0x37, 0xba, 0xb9, 0x29, 0x81, 0x28, 0x74, 0x21, 0xc3, 0x73, 0x19, 0x7b, 0xab, 0x73, 0xa3, +0x2b, 0x93, 0x9b, 0x9b, 0x12, 0xa4, 0x02, 0x00, 0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, +0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, +0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, +0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, +0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, +0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, +0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, +0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, +0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, +0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, +0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, +0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, +0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, +0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, +0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, +0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, +0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, +0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, 0xc4, 0x21, 0x07, 0x7c, 0x70, 0x03, 0x7a, 0x28, 0x87, +0x76, 0x80, 0x87, 0x19, 0xd1, 0x43, 0x0e, 0xf8, 0xe0, 0x06, 0xe4, 0x20, 0x0e, 0xe7, 0xe0, 0x06, +0xf6, 0x10, 0x0e, 0xf2, 0xc0, 0x0e, 0xe1, 0x90, 0x0f, 0xef, 0x50, 0x0f, 0xf4, 0x00, 0x00, 0x00, +0x71, 0x20, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x06, 0x60, 0xa4, 0xac, 0x09, 0x20, 0x8d, 0x15, +0x6c, 0xc3, 0xe5, 0x3b, 0x8f, 0x2f, 0x04, 0x54, 0x51, 0x10, 0x51, 0xe9, 0x00, 0x43, 0x49, 0x18, +0x80, 0x80, 0xf9, 0xc5, 0x6d, 0x9b, 0x81, 0x34, 0x5c, 0xbe, 0xf3, 0xf8, 0x42, 0x44, 0x00, 0x13, +0x11, 0x02, 0xcd, 0xb0, 0x10, 0x16, 0x30, 0x0d, 0x97, 0xef, 0x3c, 0xfe, 0xe2, 0x00, 0x83, 0xd8, +0x3c, 0xd4, 0xe4, 0x17, 0xb7, 0x6d, 0x03, 0xd0, 0x70, 0xf9, 0xce, 0xe3, 0x4b, 0x00, 0xf3, 0x2c, +0x84, 0x5f, 0xdc, 0xb6, 0x09, 0x54, 0xc3, 0xe5, 0x3b, 0x8f, 0x2f, 0x4d, 0x4e, 0x44, 0xa0, 0xd4, +0xf4, 0x50, 0x93, 0x5f, 0xdc, 0xb6, 0x11, 0x3c, 0xc3, 0xe5, 0x3b, 0x8f, 0x4f, 0x35, 0x40, 0x84, +0xf9, 0xc5, 0x6d, 0x03, 0x00, 0x00, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x14, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xbe, 0x2c, 0xdc, 0x30, 0x8e, 0xe9, 0x09, 0x0c, 0xa6, 0xa7, 0x08, 0x00, +0xa4, 0x3e, 0xb3, 0xff, 0x44, 0x58, 0x49, 0x4c, 0xc0, 0x07, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, +0xf0, 0x01, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0xa8, 0x07, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0xe7, 0x01, 0x00, 0x00, +0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, +0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, +0x1e, 0x04, 0x8b, 0x62, 0x80, 0x18, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32, 0x14, +0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x62, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5, +0x00, 0x19, 0x32, 0x42, 0xe4, 0x48, 0x0e, 0x90, 0x11, 0x23, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, +0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x31, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x1b, 0x8c, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x40, 0x02, 0xa8, 0x0d, 0x84, 0xf0, 0xff, 0xff, +0xff, 0xff, 0x03, 0x20, 0x6d, 0x30, 0x86, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x09, 0xa8, 0x00, +0x49, 0x18, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x13, 0x82, 0x60, 0x42, 0x20, 0x4c, 0x08, 0x06, +0x00, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88, 0x09, +0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, 0x14, +0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0x84, 0xc1, 0x08, 0x40, 0x09, 0x00, 0x0a, +0x66, 0x00, 0xe6, 0x08, 0xc0, 0x60, 0x8e, 0x00, 0x29, 0xc6, 0x40, 0x10, 0x44, 0x41, 0x90, 0x51, +0x0c, 0x80, 0x20, 0x88, 0x62, 0x20, 0xe4, 0xa6, 0xe1, 0xf2, 0x27, 0xec, 0x21, 0x24, 0x7f, 0x25, +0xa4, 0x95, 0x98, 0xfc, 0xe2, 0xb6, 0x51, 0x31, 0x0c, 0xc3, 0x40, 0x50, 0x71, 0xcf, 0x70, 0xf9, +0x13, 0xf6, 0x10, 0x92, 0x1f, 0x02, 0xcd, 0xb0, 0x10, 0x28, 0x58, 0x0a, 0xa3, 0x10, 0x0c, 0x33, +0x0c, 0xc3, 0x40, 0x10, 0xc4, 0x40, 0x4d, 0x19, 0x06, 0x62, 0xa0, 0xe7, 0xa8, 0xe1, 0xf2, 0x27, +0xec, 0x21, 0x24, 0x9f, 0xdb, 0xa8, 0x62, 0x25, 0x26, 0xbf, 0xb8, 0x6d, 0x44, 0x0c, 0xc3, 0x30, +0x14, 0x22, 0x22, 0x18, 0x82, 0xa4, 0x39, 0x82, 0xa0, 0x18, 0x0c, 0x51, 0x10, 0x04, 0x45, 0xd5, +0x40, 0xc0, 0x30, 0x02, 0x31, 0xcc, 0xd4, 0x06, 0xe3, 0xc0, 0x0e, 0xe1, 0x30, 0x0f, 0xf3, 0xe0, +0x06, 0xb4, 0x50, 0x0e, 0xf8, 0x40, 0x0f, 0xf5, 0x20, 0x0f, 0xe5, 0x20, 0x07, 0xa4, 0xc0, 0x07, +0xf6, 0x50, 0x0e, 0xe3, 0x40, 0x0f, 0xef, 0x20, 0x0f, 0x7c, 0x60, 0x0e, 0xec, 0xf0, 0x0e, 0xe1, +0x40, 0x0f, 0x6c, 0x00, 0x06, 0x74, 0xe0, 0x07, 0x60, 0xe0, 0x07, 0x7a, 0xa0, 0x07, 0xed, 0x90, +0x0e, 0xf0, 0x30, 0x0f, 0xbf, 0x40, 0x0f, 0xf9, 0x00, 0x0f, 0xe5, 0x80, 0x02, 0x62, 0x26, 0x31, +0x18, 0x07, 0x76, 0x08, 0x87, 0x79, 0x98, 0x07, 0x37, 0xa0, 0x85, 0x72, 0xc0, 0x07, 0x7a, 0xa8, +0x07, 0x79, 0x28, 0x07, 0x39, 0x20, 0x05, 0x3e, 0xb0, 0x87, 0x72, 0x18, 0x07, 0x7a, 0x78, 0x07, +0x79, 0xe0, 0x03, 0x73, 0x60, 0x87, 0x77, 0x08, 0x07, 0x7a, 0x60, 0x03, 0x30, 0xa0, 0x03, 0x3f, +0x00, 0x03, 0x3f, 0x40, 0x02, 0x96, 0x91, 0x76, 0x4e, 0x4a, 0x44, 0x5f, 0x04, 0x30, 0xc4, 0x46, +0x15, 0x05, 0x11, 0x21, 0x01, 0x1b, 0x88, 0xbb, 0x49, 0x9a, 0x22, 0x4a, 0x98, 0x7c, 0x16, 0x60, +0x9e, 0x85, 0x88, 0xd8, 0x09, 0x98, 0x08, 0x14, 0x10, 0xe4, 0x25, 0x02, 0x01, 0x00, 0x00, 0x00, +0x13, 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60, 0x87, 0x36, 0x68, 0x87, 0x79, 0x68, 0x03, 0x72, 0xc0, +0x87, 0x0d, 0xaf, 0x50, 0x0e, 0x6d, 0xd0, 0x0e, 0x7a, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30, +0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x73, 0x20, 0x07, +0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, +0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, +0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x10, 0x07, 0x76, 0xa0, 0x07, +0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, +0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, +0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x43, 0x9e, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x3c, 0x06, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0c, 0x79, 0x10, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x18, 0xf2, 0x34, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe4, +0x79, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xc8, 0x23, 0x01, 0x01, +0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x90, 0xa7, 0x02, 0x02, 0x60, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2c, 0x10, 0x10, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x14, +0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x22, 0x4a, 0x60, 0x04, 0xa0, +0x20, 0x8a, 0xa1, 0x08, 0x4a, 0xa2, 0x50, 0xca, 0xa0, 0x3c, 0xa8, 0x28, 0x89, 0x32, 0x28, 0x84, +0x11, 0x80, 0x22, 0x28, 0x10, 0xda, 0x66, 0x00, 0xa8, 0x9b, 0x01, 0xa0, 0x6f, 0x06, 0x80, 0xc0, +0xb1, 0x10, 0x83, 0x00, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, +0x63, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0xc4, 0x8e, 0x0c, 0x6f, 0xec, +0xed, 0x4d, 0x0c, 0x24, 0xc6, 0x05, 0xc7, 0x45, 0x86, 0x06, 0xe6, 0xc6, 0xe5, 0x06, 0x04, 0x85, +0x26, 0xc6, 0xc6, 0x2c, 0x4c, 0xcc, 0x46, 0xac, 0x26, 0x65, 0x43, 0x10, 0x4c, 0x10, 0x88, 0x63, +0x82, 0x40, 0x20, 0x1b, 0x84, 0x81, 0x98, 0x20, 0x10, 0xc9, 0x06, 0x61, 0x30, 0x28, 0xc0, 0xcd, +0x4d, 0x10, 0x08, 0x65, 0xc3, 0x80, 0x24, 0xc4, 0x04, 0x61, 0xb3, 0x08, 0x4c, 0x10, 0x88, 0x65, +0x82, 0x40, 0x30, 0x1b, 0x04, 0xc2, 0xd9, 0x90, 0x10, 0x0b, 0x43, 0x10, 0x43, 0x43, 0x3c, 0x1b, +0x02, 0x68, 0x82, 0xd0, 0x5d, 0x13, 0x04, 0xa2, 0xd9, 0x80, 0x10, 0x12, 0x43, 0x10, 0xc3, 0x04, +0x6c, 0x08, 0xa8, 0x09, 0xc2, 0x87, 0x6d, 0x40, 0x08, 0x8b, 0x21, 0x88, 0x81, 0x00, 0x36, 0x04, +0xd7, 0x06, 0x22, 0x02, 0x2a, 0x6c, 0x82, 0x00, 0x06, 0xd9, 0x86, 0x40, 0x9b, 0x20, 0x08, 0x00, +0x0d, 0xa8, 0xa9, 0xa6, 0xb0, 0x34, 0x37, 0x2e, 0x53, 0x56, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, +0x69, 0x6f, 0x6e, 0x13, 0x84, 0x02, 0x9a, 0x20, 0x14, 0xd1, 0x86, 0x80, 0x98, 0x20, 0x14, 0xd2, +0x04, 0xa1, 0x98, 0x36, 0x2c, 0x84, 0xf7, 0x81, 0x41, 0x18, 0x88, 0xc1, 0x20, 0x06, 0xc4, 0x18, +0x00, 0x44, 0xa8, 0x8a, 0xb0, 0x86, 0x9e, 0x9e, 0xa4, 0x88, 0x26, 0x08, 0x05, 0x35, 0x41, 0x20, +0x9c, 0x0d, 0xc2, 0x19, 0x9c, 0xc1, 0x86, 0x65, 0x28, 0x83, 0x6f, 0x0c, 0xc2, 0xc0, 0x0c, 0x06, +0x33, 0x18, 0xc6, 0x00, 0x0d, 0x36, 0x08, 0x64, 0x90, 0x06, 0x4c, 0xa6, 0xac, 0xbe, 0xa8, 0xc2, +0xe4, 0xce, 0xca, 0xe8, 0x26, 0x08, 0x45, 0x35, 0x41, 0x20, 0x9e, 0x0d, 0xc2, 0x19, 0xb4, 0xc1, +0x86, 0x85, 0x58, 0x83, 0x8f, 0x0d, 0xc2, 0x60, 0x0c, 0x06, 0x31, 0x20, 0xc6, 0xc0, 0x0d, 0x36, +0x04, 0x6f, 0xb0, 0x61, 0x50, 0x03, 0x38, 0x00, 0x36, 0x14, 0x5c, 0x17, 0x07, 0x19, 0x50, 0x85, +0x8d, 0xcd, 0xae, 0xcd, 0x25, 0x8d, 0xac, 0xcc, 0x8d, 0x6e, 0x4a, 0x10, 0x54, 0x21, 0xc3, 0x73, +0xb1, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x9b, 0x12, 0x10, 0x4d, 0xc8, 0xf0, 0x5c, 0xec, 0xc2, +0xd8, 0xec, 0xca, 0xe4, 0xa6, 0x04, 0x46, 0x1d, 0x32, 0x3c, 0x97, 0x39, 0xb4, 0x30, 0xb2, 0x32, +0xb9, 0xa6, 0x37, 0xb2, 0x32, 0xb6, 0x29, 0x41, 0x52, 0x86, 0x0c, 0xcf, 0x45, 0xae, 0x6c, 0xee, +0xad, 0x4e, 0x6e, 0xac, 0x6c, 0x6e, 0x4a, 0x80, 0xd5, 0x21, 0xc3, 0x73, 0xb1, 0x4b, 0x2b, 0xbb, +0x4b, 0x22, 0x9b, 0xa2, 0x0b, 0xa3, 0x2b, 0x9b, 0x12, 0x68, 0x75, 0xc8, 0xf0, 0x5c, 0xca, 0xdc, +0xe8, 0xe4, 0xf2, 0xa0, 0xde, 0xd2, 0xdc, 0xe8, 0xe6, 0xa6, 0x04, 0x71, 0x00, 0x00, 0x00, 0x00, +0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, +0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, +0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, +0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, +0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, +0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, +0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, +0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, +0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, +0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, +0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, +0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, +0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, +0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, +0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, +0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, +0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x0c, 0xc4, +0x21, 0x07, 0x7c, 0x70, 0x03, 0x7a, 0x28, 0x87, 0x76, 0x80, 0x87, 0x19, 0xd1, 0x43, 0x0e, 0xf8, +0xe0, 0x06, 0xe4, 0x20, 0x0e, 0xe7, 0xe0, 0x06, 0xf6, 0x10, 0x0e, 0xf2, 0xc0, 0x0e, 0xe1, 0x90, +0x0f, 0xef, 0x50, 0x0f, 0xf4, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, +0x06, 0x60, 0xa4, 0xac, 0x09, 0x20, 0x8d, 0x15, 0x6c, 0xc3, 0xe5, 0x3b, 0x8f, 0x2f, 0x04, 0x54, +0x51, 0x10, 0x51, 0xe9, 0x00, 0x43, 0x49, 0x18, 0x80, 0x80, 0xf9, 0xc5, 0x6d, 0x9b, 0x81, 0x34, +0x5c, 0xbe, 0xf3, 0xf8, 0x42, 0x44, 0x00, 0x13, 0x11, 0x02, 0xcd, 0xb0, 0x10, 0x16, 0x30, 0x0d, +0x97, 0xef, 0x3c, 0xfe, 0xe2, 0x00, 0x83, 0xd8, 0x3c, 0xd4, 0xe4, 0x17, 0xb7, 0x6d, 0x03, 0xd0, +0x70, 0xf9, 0xce, 0xe3, 0x4b, 0x00, 0xf3, 0x2c, 0x84, 0x5f, 0xdc, 0xb6, 0x09, 0x54, 0xc3, 0xe5, +0x3b, 0x8f, 0x2f, 0x4d, 0x4e, 0x44, 0xa0, 0xd4, 0xf4, 0x50, 0x93, 0x5f, 0xdc, 0xb6, 0x11, 0x3c, +0xc3, 0xe5, 0x3b, 0x8f, 0x4f, 0x35, 0x40, 0x84, 0xf9, 0xc5, 0x6d, 0x03, 0x61, 0x20, 0x00, 0x00, +0x51, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, +0x44, 0x8d, 0x00, 0x50, 0x51, 0x02, 0x44, 0x94, 0x4a, 0x69, 0x94, 0x42, 0xc9, 0xcd, 0x00, 0x14, +0x42, 0xd9, 0x15, 0x1e, 0x0d, 0x63, 0x04, 0x7b, 0xac, 0xc6, 0x23, 0x38, 0x8c, 0x11, 0xcc, 0x39, +0x6b, 0xce, 0xdf, 0x18, 0x01, 0x08, 0x82, 0x20, 0xfc, 0xcd, 0x00, 0x00, 0x23, 0x06, 0x09, 0x00, +0x82, 0x60, 0x50, 0x89, 0x41, 0x52, 0x81, 0x01, 0x18, 0x38, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, +0x50, 0x8d, 0x81, 0x82, 0x85, 0x41, 0x18, 0x3c, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x50, 0x91, +0xc1, 0x62, 0x89, 0x81, 0x18, 0x40, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0xa8, 0x81, 0x42, +0x06, 0x63, 0x80, 0x2d, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x60, 0xac, 0xc1, 0x52, 0x06, 0x64, +0x10, 0x31, 0x23, 0x06, 0x0f, 0x00, 0x82, 0x60, 0xd0, 0xa8, 0x81, 0x52, 0x10, 0x42, 0x60, 0x18, +0x65, 0x50, 0x06, 0x8d, 0x31, 0x9a, 0x10, 0x00, 0xa3, 0x09, 0x42, 0x30, 0x9a, 0x30, 0x08, 0xa3, +0x09, 0xc4, 0x30, 0x62, 0x70, 0x00, 0x20, 0x08, 0x06, 0x52, 0x1b, 0x40, 0x88, 0x1a, 0x8c, 0x26, +0x04, 0x81, 0x21, 0x8f, 0x7c, 0x2c, 0x10, 0xe4, 0x33, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x8f, +0x1c, 0x64, 0x81, 0x05, 0x91, 0x7c, 0x2c, 0x90, 0xe0, 0x63, 0xc1, 0x22, 0x1f, 0x13, 0x16, 0xf9, +0xd8, 0xb0, 0xc8, 0x67, 0xc4, 0xe0, 0x00, 0x40, 0x10, 0x0c, 0xa4, 0x3b, 0xd0, 0xa4, 0x3a, 0x18, +0x4d, 0x08, 0x00, 0x0b, 0x34, 0xf9, 0x8c, 0x18, 0x18, 0x00, 0x08, 0x82, 0xc1, 0xb3, 0x07, 0x63, +0x10, 0xd8, 0x11, 0xc8, 0xc7, 0x0e, 0x41, 0x3e, 0x76, 0x0c, 0xf2, 0x31, 0x65, 0x88, 0x8f, 0x29, +0x43, 0x7c, 0x4c, 0x19, 0xe2, 0x33, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x08, 0x29, 0xa0, 0x81, +0x1f, 0xf8, 0xc1, 0x1c, 0x0c, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x80, 0x90, 0x02, 0x1a, 0xf8, +0x81, 0x1f, 0xac, 0x81, 0x30, 0x62, 0x90, 0x00, 0x20, 0x08, 0x06, 0x08, 0x29, 0xa0, 0x81, 0x1f, +0xf8, 0x81, 0x1c, 0x04, 0x23, 0x06, 0x09, 0x00, 0x82, 0x60, 0x80, 0x90, 0x02, 0x1a, 0xf8, 0x81, +0x1f, 0xd4, 0x41, 0x85, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/Common/Include/frame_handler.h b/Common/Include/frame_handler.h new file mode 100644 index 00000000..b6a429f2 --- /dev/null +++ b/Common/Include/frame_handler.h @@ -0,0 +1,33 @@ +#ifndef FRAME_HANDLER_H +#define FRAME_HANDLER_H + +#include +#include +#include +#include +#include + +struct PerFrameBuffer { + DirectX::XMFLOAT4 resolution; + float time; + float padding[3]; +}; + +class FrameHandler { +public: + static ID3D11Device* g_device; + static ID3D11DeviceContext* g_deviceContext; + static ID3D11VertexShader* g_vertexShader; + static ID3D11PixelShader* g_pixelShader; + static ID3D11InputLayout* g_inputLayout; + static ID3D11Buffer* g_constantBuffer; + static ID3D11RenderTargetView* g_outputRTV; + static bool enabled; + + static void InitializeFrameHandler(ID3D11Device* device, ID3D11DeviceContext* context, const wchar_t* shaderFilePath); + static NTSTATUS AssignSwapChain(IDDCX_SWAPCHAIN hSwapChain, IDXGISwapChain* dxgiSwapChain); + static void ProcessFrame(IDDCX_SWAPCHAIN hSwapChain, LARGE_INTEGER PresentationTime); + static bool IsEnabled() { return enabled; } +}; + +#endif \ No newline at end of file diff --git a/Virtual Display Driver (HDR)/MttVDD/Driver.cpp b/Virtual Display Driver (HDR)/MttVDD/Driver.cpp index c4c3c1d9..fdcce1ee 100644 --- a/Virtual Display Driver (HDR)/MttVDD/Driver.cpp +++ b/Virtual Display Driver (HDR)/MttVDD/Driver.cpp @@ -13,13 +13,10 @@ Copyright (c) Microsoft Corporation --*/ #include "Driver.h" -#include "edid_parser.cpp" -//#include "Driver.tmh" -#include -#include -#include -#include -#include +#include +#include +#include +#include #include #include #include @@ -38,10 +35,15 @@ Copyright (c) Microsoft Corporation #include #include #include +#include "edid_parser.cpp" +#include "globals.h" +#include +#include - - - +/* +#include +#include +*/ #define PIPE_NAME L"\\\\.\\pipe\\MTTVirtualDisplayPipe" @@ -101,6 +103,9 @@ bool preventManufacturerSpoof = false; bool edidCeaOverride = false; bool sendLogsThroughPipe = true; bool PreventARlimit = true; +wstring ShaderShortName = L"CRT"; +bool ShaderEnabled = false; +wstring shaderPathfile = L"C:\\VirtualDisplayDriver\\Shaders"; //Mouse settings bool alphaCursorSupport = true; @@ -108,7 +113,6 @@ int CursorMaxX = 128; int CursorMaxY = 128; IDDCX_XOR_CURSOR_SUPPORT XorCursorSupportLevel = IDDCX_XOR_CURSOR_SUPPORT_FULL; - //Rest IDDCX_BITS_PER_COMPONENT SDRCOLOUR = IDDCX_BITS_PER_COMPONENT_8; IDDCX_BITS_PER_COMPONENT HDRCOLOUR = IDDCX_BITS_PER_COMPONENT_10; @@ -119,7 +123,6 @@ std::map> SettingsQueryMap = {L"LoggingEnabled", {L"LOGS", L"logging"}}, {L"DebugLoggingEnabled", {L"DEBUGLOGS", L"debuglogging"}}, {L"CustomEdidEnabled", {L"CUSTOMEDID", L"CustomEdid"}}, - {L"PreventMonitorSpoof", {L"PREVENTMONITORSPOOF", L"PreventSpoof"}}, {L"EdidCeaOverride", {L"EDIDCEAOVERRIDE", L"EdidCeaOverride"}}, {L"SendLogsThroughPipe", {L"SENDLOGSTHROUGHPIPE", L"SendLogsThroughPipe"}}, @@ -134,8 +137,8 @@ std::map> SettingsQueryMap = //Colour Begin {L"HDRPlusEnabled", {L"HDRPLUS", L"HDRPlus"}}, {L"SDR10Enabled", {L"SDR10BIT", L"SDR10bit"}}, - {L"ColourFormat", {L"COLOURFORMAT", L"ColourFormat"}}, - //Colour End + {L"ColourFormat", {L"COLOURFORMAT", L"ColourFormat"}} + }; const char* XorCursorSupportLevelToString(IDDCX_XOR_CURSOR_SUPPORT level) { @@ -166,6 +169,7 @@ struct IndirectDeviceContextWrapper pContext = nullptr; } }; + void LogQueries(const char* severity, const std::wstring& xmlName) { if (xmlName.find(L"logging") == std::wstring::npos) { int size_needed = WideCharToMultiByte(CP_UTF8, 0, xmlName.c_str(), (int)xmlName.size(), NULL, 0, NULL, NULL); @@ -1496,9 +1500,14 @@ vector split(string& input, char delimiter) void loadSettings() { const wstring settingsname = confpath + L"\\vdd_settings.xml"; const wstring& filename = settingsname; - bool parseEdidRes = false; // Default to false unless specified in XML + bool parseEdidRes = false; wstring resSort; + + AdapterOption adapterOption; + ComPtr device; + ComPtr context; + if (PathFileExistsW(filename.c_str())) { CComPtr pStream; CComPtr pReader; @@ -1575,15 +1584,64 @@ void loadSettings() { } else if (currentElement == L"parse_edid_res") { wstring value(pwszValue, cwchValue); - parseEdidRes = (value == L"true" || value == L"1"); // Accept "true" or "1" + parseEdidRes = (value == L"true" || value == L"1"); } else if (currentElement == L"res-sort") { resSort = wstring(pwszValue, cwchValue); } + else if (currentElement == L"ShaderEnabled") { + wstring value(pwszValue, cwchValue); + ShaderEnabled = (value == L"true" || value == L"1"); + } + else if (currentElement == L"ShaderName") { + shaderPathfile = confpath + L"\\" + L"Shaders" + L"\\" + wstring(pwszValue, cwchValue + L"_shader.h"); + if (PathFileExistsW(shaderPathfile.c_str())) { + stringstream ss; + ss << "Shader file selected: " << WStringToString(shaderPathfile).c_str(); + vddlog("i", ss.str().c_str()); + ShaderShortName = wstring(pwszValue, cwchValue); + } + else { + vddlog("w", "Shader file not found; FrameHandler disabled."); + shaderPathfile.clear(); + } + } break; } } + if (!gpuFriendlyName.empty()) { + adapterOption.xmlprovide(gpuFriendlyName); + } + else { + adapterOption.load(filename.c_str()); + } + + ComPtr selectedAdapter; + auto gpus = getAvailableGPUs(); + for (const auto& gpu : gpus) { + if (gpu.desc.AdapterLuid.LowPart == adapterOption.adapterLuid.LowPart && + gpu.desc.AdapterLuid.HighPart == adapterOption.adapterLuid.HighPart) { + selectedAdapter = gpu.adapter; + break; + } + } + if (!selectedAdapter) { + selectedAdapter = gpus.front().adapter; + vddlog("i", "No matching GPU found; using first available."); + } + + hr = D3D11CreateDevice(selectedAdapter.Get(), D3D_DRIVER_TYPE_UNKNOWN, nullptr, 0, nullptr, 0, D3D11_SDK_VERSION, &device, nullptr, &context); + if (FAILED(hr)) { + vddlog("e", "Failed to create D3D11 device."); + return; + } + + if (!shaderPathfile.empty()) { + FrameHandler::InitializeFrameHandler(device.Get(), context.Get(), shaderPathfile.c_str()); + vddlog("i", "FrameHandler initialized with shader file."); + } + for (int globalRate : globalRefreshRates) { for (const auto& resTuple : resolutions) { int global_width = get<0>(resTuple); @@ -1599,129 +1657,101 @@ void loadSettings() { monitorModes = res; vddlog("i", "Using vdd_settings.xml"); } - else { - const wstring optionsname = confpath + L"\\option.txt"; - ifstream ifs(optionsname); - if (ifs.is_open()) { - string line; - if (getline(ifs, line) && !line.empty()) { - numVirtualDisplays = stoi(line); - vector> res; - - while (getline(ifs, line)) { - vector strvec = split(line, ','); - if (strvec.size() == 3 && strvec[0].substr(0, 1) != "#") { - int vsync_num, vsync_den; - float_to_vsync(stof(strvec[2]), vsync_num, vsync_den); - res.push_back({ stoi(strvec[0]), stoi(strvec[1]), vsync_num, vsync_den }); - } - } - vddlog("i", "Using option.txt"); - monitorModes = res; - for (const auto& mode : res) { - int width, height, vsync_num, vsync_den; - tie(width, height, vsync_num, vsync_den) = mode; - stringstream ss; - ss << "Resolution: " << width << "x" << height << " @ " << vsync_num << "/" << vsync_den << "Hz"; - vddlog("d", ss.str().c_str()); + const wstring optionsname = confpath + L"\\option.txt"; + ifstream ifs(optionsname); + if (ifs.is_open()) { + string line; + if (getline(ifs, line) && !line.empty()) { + numVirtualDisplays = stoi(line); + vector> res; + + while (getline(ifs, line)) { + vector strvec = split(line, ','); + if (strvec.size() == 3 && strvec[0].substr(0, 1) != "#") { + int vsync_num, vsync_den; + float_to_vsync(stof(strvec[2]), vsync_num, vsync_den); + res.push_back({ stoi(strvec[0]), stoi(strvec[1]), vsync_num, vsync_den }); } } - else { - vddlog("w", "option.txt is empty or the first line is invalid. Enabling Fallback"); - } - ifs.close(); - } - else { - numVirtualDisplays = 1; - vector> res; - vector> fallbackRes = { - {800, 600, 30.0f}, {800, 600, 60.0f}, {800, 600, 90.0f}, {800, 600, 120.0f}, {800, 600, 144.0f}, {800, 600, 165.0f}, - {1280, 720, 30.0f}, {1280, 720, 60.0f}, {1280, 720, 90.0f}, {1280, 720, 130.0f}, {1280, 720, 144.0f}, {1280, 720, 165.0f}, - {1366, 768, 30.0f}, {1366, 768, 60.0f}, {1366, 768, 90.0f}, {1366, 768, 120.0f}, {1366, 768, 144.0f}, {1366, 768, 165.0f}, - {1920, 1080, 30.0f}, {1920, 1080, 60.0f}, {1920, 1080, 90.0f}, {1920, 1080, 120.0f}, {1920, 1080, 144.0f}, {1920, 1080, 165.0f}, - {2560, 1440, 30.0f}, {2560, 1440, 60.0f}, {2560, 1440, 90.0f}, {2560, 1440, 120.0f}, {2560, 1440, 144.0f}, {2560, 1440, 165.0f}, - {3840, 2160, 30.0f}, {3840, 2160, 60.0f}, {3840, 2160, 90.0f}, {3840, 2160, 120.0f}, {3840, 2160, 144.0f}, {3840, 2160, 165.0f} - }; - vddlog("i", "Loading Fallback - no settings found"); - for (const auto& mode : fallbackRes) { - int width, height; - float refreshRate; - tie(width, height, refreshRate) = mode; - int vsync_num, vsync_den; - float_to_vsync(refreshRate, vsync_num, vsync_den); - res.push_back(make_tuple(width, height, vsync_num, vsync_den)); + vddlog("i", "Using option.txt"); + monitorModes = res; + for (const auto& mode : res) { + int width, height, vsync_num, vsync_den; + tie(width, height, vsync_num, vsync_den) = mode; stringstream ss; ss << "Resolution: " << width << "x" << height << " @ " << vsync_num << "/" << vsync_den << "Hz"; vddlog("d", ss.str().c_str()); } - monitorModes = res; - } - } - - // EDID override: Only if true in XML and user_edid.bin exists - if (parseEdidRes) { - const wstring edidname = confpath + L"\\user_edid.bin"; - if (PathFileExistsW(edidname.c_str())) { - try { - string edidPath = WStringToString(edidname); // Convert wstring to string using safe conversion - monitorModes = EdidParser::load_and_parse_edid(edidPath); - vddlog("i", "Overriding monitor modes with user_edid.bin (parse_edid_res = true)"); - for (const auto& mode : monitorModes) { - int width, height, vsync_num, vsync_den; - tie(width, height, vsync_num, vsync_den) = mode; - stringstream ss; - ss << "EDID Resolution: " << width << "x" << height << " @ " << vsync_num << "/" << vsync_den << "Hz"; - vddlog("d", ss.str().c_str()); - } - } - catch (const std::exception& e) { - vddlog("e", ("EDID parsing failed: " + string(e.what())).c_str()); - // Keep existing monitorModes (XML, option.txt, or fallback) on failure - } + return; } else { - vddlog("w", "parse_edid_res is true, but user_edid.bin not found; keeping current modes"); - } - // Sort and cap monitorModes to 92, - // Sort based on res-sort in xml, (x-desc | y-ass | ref.rate) defaults to x-desc - if (!monitorModes.empty()) { - // Parse res-sort value - bool descending = resSort.find(L"desc") != wstring::npos; - if (resSort.find(L"x") != wstring::npos) { - std::sort(monitorModes.begin(), monitorModes.end(), - [descending](const tuple& a, const tuple& b) { - return descending ? std::get<0>(a) > std::get<0>(b) : std::get<0>(a) < std::get<0>(b); - }); - } - else if (resSort.find(L"y") != wstring::npos) { - std::sort(monitorModes.begin(), monitorModes.end(), - [descending](const tuple& a, const tuple& b) { - return descending ? std::get<1>(a) > std::get<1>(b) : std::get<1>(a) < std::get<1>(b); - }); - } - else if (resSort.find(L"ref.rate") != wstring::npos) { - std::sort(monitorModes.begin(), monitorModes.end(), - [descending](const tuple& a, const tuple& b) { - return descending ? std::get<2>(a) > std::get<2>(b) : std::get<2>(a) < std::get<2>(b); - }); - } - else { - // Default to x-desc if res-sort is invalid - std::sort(monitorModes.begin(), monitorModes.end(), - [](const tuple& a, const tuple& b) { - return std::get<0>(a) > std::get<0>(b); - }); - } + vddlog("w", "option.txt is empty or the first line is invalid. Enabling Fallback"); + } + } + + numVirtualDisplays = 1; + vector> res; + vector> fallbackRes = { + {800, 600, 30.0f}, + {800, 600, 60.0f}, + {800, 600, 90.0f}, + {800, 600, 120.0f}, + {800, 600, 144.0f}, + {800, 600, 165.0f}, + {1280, 720, 30.0f}, + {1280, 720, 60.0f}, + {1280, 720, 90.0f}, + {1280, 720, 130.0f}, + {1280, 720, 144.0f}, + {1280, 720, 165.0f}, + {1366, 768, 30.0f}, + {1366, 768, 60.0f}, + {1366, 768, 90.0f}, + {1366, 768, 120.0f}, + {1366, 768, 144.0f}, + {1366, 768, 165.0f}, + {1920, 1080, 30.0f}, + {1920, 1080, 60.0f}, + {1920, 1080, 90.0f}, + {1920, 1080, 120.0f}, + {1920, 1080, 144.0f}, + {1920, 1080, 165.0f}, + {2560, 1440, 30.0f}, + {2560, 1440, 60.0f}, + {2560, 1440, 90.0f}, + {2560, 1440, 120.0f}, + {2560, 1440, 144.0f}, + {2560, 1440, 165.0f}, + {3840, 2160, 30.0f}, + {3840, 2160, 60.0f}, + {3840, 2160, 90.0f}, + {3840, 2160, 120.0f}, + {3840, 2160, 144.0f}, + {3840, 2160, 165.0f} + }; - // Cap at 92 modes, keeping highest values based on sort - if (monitorModes.size() > 92) { - monitorModes.resize(92); - vddlog("i", "Capped monitorModes to 92, removed lowest-value modes based on sort"); - } - } + vddlog("i", "Loading Fallback - no settings found"); + + for (const auto& mode : fallbackRes) { + int width, height; + float refreshRate; + tie(width, height, refreshRate) = mode; + + int vsync_num, vsync_den; + float_to_vsync(refreshRate, vsync_num, vsync_den); + + stringstream ss; + res.push_back(make_tuple(width, height, vsync_num, vsync_den)); + + + ss << "Resolution: " << width << "x" << height << " @ " << vsync_num << "/" << vsync_den << "Hz"; + vddlog("d", ss.str().c_str()); } + + monitorModes = res; + return; } _Use_decl_annotations_ @@ -2191,9 +2221,14 @@ void SwapChainProcessor::RunCore() vddlog("e", logStream.str().c_str()); return; } - logStream << "DXGI device interface obtained successfully."; - //vddlog("d", logStream.str().c_str()); + // Initialize the frame handler if not already done + if (!FrameHandler::g_device) { + FrameHandler::InitializeFrameHandler(m_Device->Device.Get(), m_Device->DeviceContext.Get(), L"crt_shader"); + logStream.str(""); + logStream << "Frame handler initialized with CRT shader."; + vddlog("i", logStream.str().c_str()); + } IDARG_IN_SWAPCHAINSETDEVICE SetDevice = {}; SetDevice.pDevice = DxgiDevice.Get(); @@ -2206,10 +2241,19 @@ void SwapChainProcessor::RunCore() vddlog("e", logStream.str().c_str()); return; } - logStream << "Device set to swap chain successfully."; - //vddlog("d", logStream.str().c_str()); - logStream.str(""); + // Assign the swap chain to the frame handler + ComPtr swapChain; + NTSTATUS status = FrameHandler::AssignSwapChain(m_hSwapChain, swapChain.Get()); + + if (status != STATUS_SUCCESS) + { + logStream.str(""); + logStream << "Failed to assign swap chain to frame handler. NTSTATUS: " << status; + vddlog("e", logStream.str().c_str()); + } + + logStream.str(""); logStream << "Starting buffer acquisition and release loop."; //vddlog("d", logStream.str().c_str()); @@ -2234,11 +2278,10 @@ void SwapChainProcessor::RunCore() hr = IddCxSwapChainReleaseAndAcquireBuffer(m_hSwapChain, &Buffer); pSurface = Buffer.MetaData.pSurface; } - // AcquireBuffer immediately returns STATUS_PENDING if no buffer is yet available - logStream.str(""); + if (hr == E_PENDING) { - // We must wait for a new buffer + // Wait for a new buffer HANDLE WaitHandles[] = { m_hAvailableBufferEvent, @@ -2246,25 +2289,21 @@ void SwapChainProcessor::RunCore() }; DWORD WaitResult = WaitForMultipleObjects(ARRAYSIZE(WaitHandles), WaitHandles, FALSE, 16); - logStream << "Buffer acquisition pending. WaitResult: " << WaitResult; - if (WaitResult == WAIT_OBJECT_0 || WaitResult == WAIT_TIMEOUT) { - // We have a new buffer, so try the AcquireBuffer again - //vddlog("d", "New buffer trying aquire new buffer"); + // Try again continue; } else if (WaitResult == WAIT_OBJECT_0 + 1) { - // We need to terminate - logStream << "Terminate event signaled. Exiting loop."; - //vddlog("d", logStream.str().c_str()); + // Terminate break; } else { - // The wait was cancelled or something unexpected happened + // Error handling hr = HRESULT_FROM_WIN32(WaitResult); + logStream.str(""); logStream << "Unexpected wait result. HRESULT: " << hr; vddlog("e", logStream.str().c_str()); break; @@ -2275,37 +2314,79 @@ void SwapChainProcessor::RunCore() AcquiredBuffer.Attach(pSurface); // ============================== - // TODO: Process the frame here - // - // This is the most performance-critical section of code in an IddCx driver. It's important that whatever - // is done with the acquired surface be finished as quickly as possible. This operation could be: - // * a GPU copy to another buffer surface for later processing (such as a staging surface for mapping to CPU memory) - // * a GPU encode operation - // * a GPU VPBlt to another surface - // * a GPU custom compute shader encode operation + // Process the frame here // ============================== + if (FrameHandler::IsEnabled()) + { + // Create a render target view for the acquired buffer + ComPtr texture; + hr = AcquiredBuffer.As(&texture); + + if (SUCCEEDED(hr)) + { + // Create RTV if needed + D3D11_RENDER_TARGET_VIEW_DESC rtvDesc = {}; + rtvDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; + rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; + rtvDesc.Texture2D.MipSlice = 0; + + // Release previous RTV if any + if (FrameHandler::g_outputRTV) + { + FrameHandler::g_outputRTV->Release(); + FrameHandler::g_outputRTV = nullptr; + } + + hr = FrameHandler::g_device->CreateRenderTargetView(texture.Get(), &rtvDesc, &FrameHandler::g_outputRTV); + + if (SUCCEEDED(hr)) + { + // Get current time for shader animation + LARGE_INTEGER presentationTime; + QueryPerformanceCounter(&presentationTime); + + // Process the frame with the shader + FrameHandler::ProcessFrame(m_hSwapChain, presentationTime); + } + else + { + // Failed to create RTV, just pass the frame through + logStream.str(""); + logStream << "Failed to create render target view. HRESULT: " << hr; + vddlog("e", logStream.str().c_str()); + + AcquiredBuffer.Reset(); + hr = IddCxSwapChainFinishedProcessingFrame(m_hSwapChain); + } + } + else + { + // Failed to get texture, just pass the frame through + logStream.str(""); + logStream << "Failed to get texture from acquired buffer. HRESULT: " << hr; + vddlog("e", logStream.str().c_str()); + + AcquiredBuffer.Reset(); + hr = IddCxSwapChainFinishedProcessingFrame(m_hSwapChain); + } + } + else + { + // Frame handler disabled, just pass the frame through + AcquiredBuffer.Reset(); + hr = IddCxSwapChainFinishedProcessingFrame(m_hSwapChain); + } - AcquiredBuffer.Reset(); - //vddlog("d", "Reset buffer"); - hr = IddCxSwapChainFinishedProcessingFrame(m_hSwapChain); if (FAILED(hr)) { break; } - - // ============================== - // TODO: Report frame statistics once the asynchronous encode/send work is completed - // - // Drivers should report information about sub-frame timings, like encode time, send time, etc. - // ============================== - // IddCxSwapChainReportFrameStatistics(m_hSwapChain, ...); } else { - logStream.str(""); // Clear the stream - logStream << "Failed to acquire buffer. Exiting loop. The swap-chain was likely abandoned (e.g. DXGI_ERROR_ACCESS_LOST) - HRESULT: " << hr; + logStream.str(""); + logStream << "Failed to acquire buffer. Exiting loop. HRESULT: " << hr; vddlog("e", logStream.str().c_str()); - // The swap-chain was likely abandoned (e.g. DXGI_ERROR_ACCESS_LOST), so exit the processing loop break; } } @@ -2364,7 +2445,7 @@ void modifyEdid(vector& edid) { } void ARnullEdid(vector& edid) { - if (edid.size() < 12) { + if (edid.size() < 23) { return; } @@ -2751,6 +2832,7 @@ void IndirectDeviceContext::UnassignSwapChain() #pragma region DDI Callbacks +_Use_decl_annotations_ _Use_decl_annotations_ NTSTATUS VirtualDisplayDriverAdapterInitFinished(IDDCX_ADAPTER AdapterObject, const IDARG_IN_ADAPTER_INIT_FINISHED* pInArgs) { @@ -2770,11 +2852,10 @@ NTSTATUS VirtualDisplayDriverAdapterInitFinished(IDDCX_ADAPTER AdapterObject, co vddlog("e", ss.str().c_str()); } vddlog("i", "Finished Setting up adapter."); - + return STATUS_SUCCESS; } - _Use_decl_annotations_ NTSTATUS VirtualDisplayDriverAdapterCommitModes(IDDCX_ADAPTER AdapterObject, const IDARG_IN_COMMITMODES* pInArgs) { diff --git a/Virtual Display Driver (HDR)/MttVDD/Driver.h b/Virtual Display Driver (HDR)/MttVDD/Driver.h index 17be5b32..91671e13 100644 --- a/Virtual Display Driver (HDR)/MttVDD/Driver.h +++ b/Virtual Display Driver (HDR)/MttVDD/Driver.h @@ -6,15 +6,12 @@ #include #include #include - #include #include #include #include - #include #include - #include "Trace.h" namespace Microsoft diff --git a/Virtual Display Driver (HDR)/MttVDD/MttVDD.vcxproj b/Virtual Display Driver (HDR)/MttVDD/MttVDD.vcxproj index dc979e31..2fe434db 100644 --- a/Virtual Display Driver (HDR)/MttVDD/MttVDD.vcxproj +++ b/Virtual Display Driver (HDR)/MttVDD/MttVDD.vcxproj @@ -36,12 +36,11 @@ + - - true - + @@ -55,6 +54,7 @@ Debug Win32 IddSampleDriver + $(LatestTargetPlatformVersion) WindowsUserModeDriver10.0 @@ -223,6 +223,7 @@ Async true $(ProjectDir)..\..\Common\Include;%(AdditionalIncludeDirectories) + stdcpp17 %(AdditionalDependencies);OneCoreUAP.lib;avrt.lib @@ -236,6 +237,7 @@ Async true $(ProjectDir)..\..\Common\Include;%(AdditionalIncludeDirectories) + stdcpp17 %(AdditionalDependencies);OneCoreUAP.lib;avrt.lib @@ -271,8 +273,7 @@ true /D_ATL_NO_WIN_SUPPORT /DUMDF_DRIVER /DIDDCX_VERSION_MAJOR=1 /DIDDCX_VERSION_MINOR=10 /DIDDCX_MINIMUM_VERSION_REQUIRED=3 %(AdditionalOptions) $(ProjectDir)..\..\Common\Include;%(AdditionalIncludeDirectories) - false - stdcpp14 + stdcpp17 %(AdditionalDependencies);OneCoreUAP.lib;avrt.lib @@ -291,6 +292,7 @@ trace.h Async true + stdcpp17 %(AdditionalDependencies);OneCoreUAP.lib;avrt.lib @@ -303,6 +305,7 @@ trace.h Async true + stdcpp17 %(AdditionalDependencies);OneCoreUAP.lib;avrt.lib @@ -341,6 +344,7 @@ true /D_ATL_NO_WIN_SUPPORT /DUMDF_DRIVER /DIDDCX_VERSION_MAJOR=1 /DIDDCX_VERSION_MINOR=10 /DIDDCX_MINIMUM_VERSION_REQUIRED=3 %(AdditionalOptions) $(ProjectDir)..\..\Common\Include;%(AdditionalIncludeDirectories) + stdcpp17 %(AdditionalDependencies);OneCoreUAP.lib;avrt.lib diff --git a/Virtual Display Driver (HDR)/MttVDD/MttVDD.vcxproj.filters b/Virtual Display Driver (HDR)/MttVDD/MttVDD.vcxproj.filters index 63e68876..ad095f3f 100644 --- a/Virtual Display Driver (HDR)/MttVDD/MttVDD.vcxproj.filters +++ b/Virtual Display Driver (HDR)/MttVDD/MttVDD.vcxproj.filters @@ -30,7 +30,7 @@ Header Files - + Header Files @@ -38,6 +38,9 @@ Source Files + + Source Files + diff --git a/Virtual Display Driver (HDR)/MttVDD/frame_handler.cpp b/Virtual Display Driver (HDR)/MttVDD/frame_handler.cpp new file mode 100644 index 00000000..179c07df --- /dev/null +++ b/Virtual Display Driver (HDR)/MttVDD/frame_handler.cpp @@ -0,0 +1,151 @@ +#include "frame_handler.h" +#include +#include +#include +#include +#include +#include +#include "globals.h" +#include "CRT_shader.h" + +ID3D11Device* FrameHandler::g_device = nullptr; +ID3D11DeviceContext* FrameHandler::g_deviceContext = nullptr; +ID3D11VertexShader* FrameHandler::g_vertexShader = nullptr; +ID3D11PixelShader* FrameHandler::g_pixelShader = nullptr; +ID3D11InputLayout* FrameHandler::g_inputLayout = nullptr; +ID3D11Buffer* FrameHandler::g_constantBuffer = nullptr; +ID3D11RenderTargetView* FrameHandler::g_outputRTV = nullptr; +bool FrameHandler::enabled = false; + +void FrameHandler::InitializeFrameHandler(ID3D11Device* device, ID3D11DeviceContext* context, const wchar_t* shaderfilepath) { + UNREFERENCED_PARAMETER(shaderfilepath); + g_device = device; + g_deviceContext = context; + enabled = false; + + std::wstring activeShaderName = ShaderShortName; + + if (activeShaderName.empty() || activeShaderName == L"") { + return; + } + + if (activeShaderName == L"CRT") { +#include "CRT_shader.h" + enabled = true; + + D3D11_INPUT_ELEMENT_DESC layout[] = { + {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}, + {"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0}, + }; + + HRESULT hr = g_device->CreateInputLayout(layout, ARRAYSIZE(layout), CRTShader_VS, CRTShader_VS_size, &g_inputLayout); + if (FAILED(hr)) return; + + hr = g_device->CreateVertexShader(CRTShader_VS, CRTShader_VS_size, nullptr, &g_vertexShader); + if (FAILED(hr)) return; + + hr = g_device->CreatePixelShader(CRTShader_PS, CRTShader_PS_size, nullptr, &g_pixelShader); + if (FAILED(hr)) return; + } + else { + std::wstring header = activeShaderName + L"_shader.h"; + } + + D3D11_BUFFER_DESC cbDesc = {}; + cbDesc.ByteWidth = sizeof(PerFrameBuffer); + cbDesc.Usage = D3D11_USAGE_DYNAMIC; + cbDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; + cbDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + HRESULT hr = g_device->CreateBuffer(&cbDesc, nullptr, &g_constantBuffer); + if (FAILED(hr)) enabled = false; +} + +NTSTATUS FrameHandler::AssignSwapChain(IDDCX_SWAPCHAIN hSwapChain, IDXGISwapChain* dxgiSwapChain) { + if (!g_device || !g_deviceContext || !enabled) return STATUS_INVALID_PARAMETER; + + IDXGIDevice* dxgiDevice = nullptr; + HRESULT hr = g_device->QueryInterface(__uuidof(IDXGIDevice), (void**)&dxgiDevice); + if (FAILED(hr)) return STATUS_UNSUCCESSFUL; + + IDARG_IN_SWAPCHAINSETDEVICE swapChainArgs = {}; + swapChainArgs.pDevice = dxgiDevice; + + hr = IddCxSwapChainSetDevice(hSwapChain, &swapChainArgs); + dxgiDevice->Release(); + if (FAILED(hr)) return STATUS_UNSUCCESSFUL; + + if (dxgiSwapChain) { + ID3D11Texture2D* backBuffer = nullptr; + hr = dxgiSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&backBuffer); + if (SUCCEEDED(hr) && backBuffer) { + hr = g_device->CreateRenderTargetView(backBuffer, nullptr, &g_outputRTV); + backBuffer->Release(); + if (FAILED(hr)) return STATUS_UNSUCCESSFUL; + } + } + + return STATUS_SUCCESS; +} + +void FrameHandler::ProcessFrame(IDDCX_SWAPCHAIN hSwapChain, LARGE_INTEGER PresentationTime) { + if (!enabled || !g_deviceContext || !g_outputRTV) return; + + UNREFERENCED_PARAMETER(hSwapChain); // Silence C4100 warning + + /* Example: Use hSwapChain (simplified, adjust as per your IDDCX setup) + IDARG_OUT_RELEASEANDACQUIREBUFFER bufferArgs = {}; + HRESULT hr = IddCxSwapChainReleaseAndAcquireBuffer(hSwapChain, &bufferArgs); + if (FAILED(hr)) return; + */ + + float clearColor[4] = { 0.0f, 0.0f, 0.0f, 1.0f }; + g_deviceContext->ClearRenderTargetView(g_outputRTV, clearColor); + + if (g_vertexShader && g_pixelShader && g_inputLayout && g_constantBuffer) { + g_deviceContext->IASetInputLayout(g_inputLayout); + g_deviceContext->VSSetShader(g_vertexShader, nullptr, 0); + g_deviceContext->PSSetShader(g_pixelShader, nullptr, 0); + + D3D11_MAPPED_SUBRESOURCE mappedResource; + HRESULT hr = g_deviceContext->Map(g_constantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); + if (SUCCEEDED(hr)) { + PerFrameBuffer* bufferData = (PerFrameBuffer*)mappedResource.pData; + bufferData->resolution = DirectX::XMFLOAT4(1920.0f, 1080.0f, 0.0f, 0.0f); + bufferData->time = static_cast(PresentationTime.QuadPart) / 10000000.0f; + g_deviceContext->Unmap(g_constantBuffer, 0); + } + + g_deviceContext->VSSetConstantBuffers(0, 1, &g_constantBuffer); + g_deviceContext->PSSetConstantBuffers(0, 1, &g_constantBuffer); + + struct Vertex { + DirectX::XMFLOAT3 pos; + DirectX::XMFLOAT2 tex; + }; + Vertex vertices[] = { + {{ -1.0f, 1.0f, 0.0f }, { 0.0f, 0.0f }}, + {{ 1.0f, 1.0f, 0.0f }, { 1.0f, 0.0f }}, + {{ -1.0f, -1.0f, 0.0f }, { 0.0f, 1.0f }}, + {{ 1.0f, -1.0f, 0.0f }, { 1.0f, 1.0f }}, + }; + + D3D11_BUFFER_DESC vbDesc = {}; + vbDesc.ByteWidth = sizeof(vertices); + vbDesc.Usage = D3D11_USAGE_DEFAULT; + vbDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + D3D11_SUBRESOURCE_DATA vbData = {}; + vbData.pSysMem = vertices; + ID3D11Buffer* vertexBuffer = nullptr; + hr = g_device->CreateBuffer(&vbDesc, &vbData, &vertexBuffer); + if (SUCCEEDED(hr)) { + UINT stride = sizeof(Vertex); + UINT offset = 0; + g_deviceContext->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset); + g_deviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); + g_deviceContext->Draw(4, 0); + vertexBuffer->Release(); + } + + g_deviceContext->OMSetRenderTargets(1, &g_outputRTV, nullptr); + } +} \ No newline at end of file diff --git a/Virtual Display Driver (HDR)/MttVDD/globals.h b/Virtual Display Driver (HDR)/MttVDD/globals.h new file mode 100644 index 00000000..5455d51f --- /dev/null +++ b/Virtual Display Driver (HDR)/MttVDD/globals.h @@ -0,0 +1,11 @@ +#ifndef GLOBALS_H +#define GLOBALS_H + +#include // For std::wstring + +// Declare global shader name set by driver.cpp +extern std::wstring ShaderShortName; +extern std::wstring shaderPathfile; + + +#endif // GLOBALS_H \ No newline at end of file diff --git a/Virtual Display Driver (HDR)/vdd_settings.xml b/Virtual Display Driver (HDR)/vdd_settings.xml index 9b1ae738..71e2af8a 100644 --- a/Virtual Display Driver (HDR)/vdd_settings.xml +++ b/Virtual Display Driver (HDR)/vdd_settings.xml @@ -101,4 +101,6 @@ x-desc + false + CRT \ No newline at end of file